Experience/항해99 18기

Java 문법 2주차 숙제

chillmyh 2023. 11. 23. 01:43

 

문제 설명

 

풀이

import java.util.*;

public class hw2re {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // Scanner을 이용하여 System 안에서 입력받음.
        String saveType = sc.nextLine(); // 저장할 자료구조명을 입력합니다. (List / Set / Map)
        String title = sc.nextLine(); // 제목 입력

        if (Objects.equals(saveType, "List")) { // saveType에 입력된게 "List"와 같으면
            ArrayList<String> strList = new ArrayList<>(); //ArrayList String타입 strList 생성
            while(!strList.contains("끝")) { // strList에 끝 이 포함되기 전 동안
                strList.add(sc.nextLine()); // strList에 scan된 값을 추가한다
            }
            strList.remove("끝"); // 끝에는 번호를 안매길거니까 끝을 지워준다

            // 제목 수정 출력 //
            System.out.println("[ List 으로 저장된 " + title + " ]");

            // 번호 붙여서 레시피 출력 //
            for (int i=0; i < strList.size(); i++) { // strList의 size만큼 index i를 0부터 1씩 더하는 동안
                                                    // 0 ~ strList.size();
                int number = i + 1; // 번호 1.부터 시작할거니까
                System.out.println(number + ". " + strList.get(i)); // i번째 strList를 number 매겨서 출력
            }
            System.out.println("끝"); // 아까 번호 안매길라고 지웠던 끝 다시 출력 (문제 조건만족용)

        } else if (Objects.equals(saveType, "Set")) { // saveType에 입력된게 "Set"와 같으면
            LinkedHashSet<String> strSet = new LinkedHashSet<>(); // 선언
            while(!strSet.contains("끝")) {
                strSet.add(sc.nextLine());
            }
            strSet.remove("끝");

            // 제목 수정 출력 //
            System.out.println("[ Set 으로 저장된 " + title + " ]");

            // 번호 붙여서 레시피 출력 //
            Iterator iterator = strSet.iterator();
            for (int i = 0; i < strSet.size(); i++) {
                int number = i + 1;
                System.out.println(number + ". " + iterator.next());
            }
            System.out.println("끝");

        } else if (Objects.equals(saveType, "Map")) {
            Map<Integer, String> strMap = new HashMap<>();
            int lineNumber = 1;
            while (true) {
                String text = sc.nextLine();
                if (Objects.equals(text, "끝")) {
                    break;
                }
                strMap.put(lineNumber++, text);
            }
            // 제목 수정 출력 //
            System.out.println("[ Map 으로 저장된 " + title + " ]");

            // 번호 붙여서 레시피 출력 //
            for (int i=0; i < strMap.size(); i++) {
                int number = i + 1;
                System.out.println(number + ". " + strMap.get(i + 1));
            }

        } else {
            System.out.println("잘못된 입력입니다.");
        }
    }
}

 

궁금한 것

1. Map부분의 끝 쪽에서 strMap.get(i + 1) i+1번째 value를 가져와야만 정상적으로 번호가 매겨져서 출력됐는데

strMap.get(i) 를 하면 0번째 입력된 정보부터 가져오는 거일텐데 실제로 출력하면 1. null 로 출력되고 다음부터 입력한 값이 2. 부터 번호매겨 출력되는지 잘 모르겠음.

2. 끝을 입력했을 때 while문을 종료하는 부분에서 위에 작성한 코드 방법과 while(true)와 if (Objects.equals(text, "끝")), break;를 사용하는 방법 말고 다른 효율적인 방법이 뭐가 있을까?

3. Map은 key - value pair구조로 이루어져있는데, 위 코드 상황 처럼 value값에 스캔한 입력값을 저장할 때 remove 는 키값을 입력해 삭제하는건데 value값만 알고있고 key값은 정확히 모를 때 특정 value값을 삭제하는 방법은 없을까?