JAVA

TIL-13 자료구조 활용해 레시피 메모장 만들기

다오__ 2023. 5. 23. 15:23

자료구조를 학습하는 주차에서 활용하는 문제를 풀었다.

💁‍♀️ 자료구조 요리 레시피 메모장 만들기

  • 입력값
    • 저장할 자료구조명을 입력합니다. (List / Set / Map)
    • 내가 좋아하는 요리 제목을 먼저 입력합니다.
    • 이어서 내가 좋아하는 요리 레시피를 한문장씩 입력합니다.
    • 입력을 마쳤으면 마지막에 “끝” 문자를 입력합니다.
  • 출력값
    • 입력이 종료되면 저장한 자료구조 이름과 요리 제목을 괄호로 감싸서 먼저 출력 해줍니다.
    • 이어서, 입력한 모든 문장앞에 번호를 붙여서 입력 순서에 맞게 모두 출력 해줍니다.

우선 입력값을 받기 위해 Scanner를 사용하고 자료구조명과 요리 제목을 입력받았다.

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String structure, title, recipe;
        ArrayList<String> list;
        Map<String, String> map;
        Set<String> set;

        while (true) {
            System.out.println("저장할 자료구조명 : list, set, map");
            structure = in.next();

            System.out.println("내가 좋아하는 요리 제목 : ");
            title = in.next();

            int i = 1;
            switch (structure.toLowerCase()) {

곰곰히 생각해보았다.

자료구조명이 각각 다르면 데이터를 넣고 뺄때 메서드만 다르고 반복문 때문에 불필요한 코드중복이 생길것이고,,,

그러면 함수로 만들어 코드를 간략화 하는게 낫지 않을까?

그래서 input_recipe(Object data, String method)라는 함수를 만들고 매개변수를 받게끔 만들었는데

나의 착각이었다.. String method 변수를 어떻게 메서드로 사용할 것인지 답이 나오질 않아 함수를 지우고 그냥 3개의 반복코드를 작성하기로 하였다..

while (true) {
            System.out.println("저장할 자료구조명 : list, set, map");
            structure = in.nextLine();

            System.out.println("내가 좋아하는 요리 제목 : ");
            title = in.nextLine();

            int i = 1;
            switch (structure.toLowerCase()) {
                case "list" -> {
                    list = new ArrayList<>();
                    System.out.println("요리 레시피 입력하기");
                    while(true){

                        recipe = in.nextLine();
                        if (recipe.equals("끝"))
                            break;

                        list.add(i + ". " + recipe);
                        i++;
                    }
                    i = 1;

                    System.out.println("[ " + structure + "으로 저장된 " + title + " ]");
                    for (String data : list) {
                        System.out.println(data);
                    }

                    break;
                }
                case "set" -> {
                    set = new HashSet<>();
                    System.out.println("요리 레시피 입력하기");
                    while(true){

                        recipe = in.nextLine();
                        if (recipe.equals("끝"))
                            break;

                        set.add(i + ". " + recipe);
                        i++;
                    }
                    i = 1;
                    System.out.println("[ " + structure + "으로 저장된 " + title + " ]");
                    for (String data : set) {
                        System.out.println(data);
                    }
                    break;
                }

list와 set은 쉽게 구현을 할 수 있었다. i값을 번호로 주고 그 뒤에 값을 입력하는 식

map은 키를 String으로 두어 1. , 2. , 3. 이렇게 넣고, 값은 데이터를 넣었다.

하지만 문제가 한가지 발생했다. 키와 값을 동시에 한개씩 어떻게 꺼내지?

내가 알고있는것은 keySet()으로 한꺼번에 키를 꺼내는 것과 values로 값을 한꺼번에 꺼내는 것..

바로 검색해서 알아보니 entrySet() 메서드를 사용해 꺼낼 수 있었다.

entrySet에 대해서 알아보았다.

for (Map.Entry<String, Integer> pair : map.entrySet()) {
  System.out.println(String.format("Key (name) is: %s, Value (age) is : %s", pair.getKey(), pair.getValue()));
}

https://developer-talk.tistory.com/392

Map을 들어가보니 Set인터페이스에 entrySet메서드가 있었다.

또한 안에 interface Entry가 있었고 거기안에 getKey 메서드와 getValue 메서드를 확인할 수 있었다.

entrySet()메서드를 사용하면 Set<Map.Entry<K,V>> 타입으로 리턴한다. 해당 타입의 각각의 값들의 타입은 Map.Entry<K,V> 타입으로써 for문을 위의 예문처럼 사용할 수 있다.

Map.Entry<K,V>안에는 getKey(), getValue()메서드가 있다.

이렇게 해서 map을 사용한 레시피 작성도 완성할 수 있었다

최종 코드

public class Quiz {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String structure, title, recipe;
        ArrayList<String> list;
        Map<String, String> map;
        Set<String> set;

        while (true) {
            System.out.println("저장할 자료구조명 : list, set, map");
            structure = in.nextLine();

            System.out.println("내가 좋아하는 요리 제목 : ");
            title = in.nextLine();

            int i = 1;
            switch (structure.toLowerCase()) {
                case "list" -> {
                    list = new ArrayList<>();
                    System.out.println("요리 레시피 입력하기");
                    while(true){

                        recipe = in.nextLine();
                        if (recipe.equals("끝"))
                            break;

                        list.add(i + ". " + recipe);
                        i++;
                    }
                    i = 1;

                    System.out.println("[ " + structure + "으로 저장된 " + title + " ]");
                    for (String data : list) {
                        System.out.println(data);
                    }

                    break;
                }
                case "set" -> {
                    set = new HashSet<>();
                    System.out.println("요리 레시피 입력하기");
                    while(true){

                        recipe = in.nextLine();
                        if (recipe.equals("끝"))
                            break;

                        set.add(i + ". " + recipe);
                        i++;
                    }
                    i = 1;
                    System.out.println("[ " + structure + "으로 저장된 " + title + " ]");
                    for (String data : set) {
                        System.out.println(data);
                    }
                    break;
                }
                case "map" -> {
                    map = new HashMap<>();
                    System.out.println("요리 레시피 입력하기");
                    while (true) {
                        recipe = in.nextLine();
                        if (recipe.equals("끝"))
                            break;

                        map.put(i + ". ", recipe);
                        i++;
                    }
                    i = 1;
                    System.out.println("[ " + structure + "으로 저장된 " + title + " ]");
                    for (Map.Entry<String, String> entry : map.entrySet()) {
                        System.out.printf("%s%s%n", entry.getKey(), entry.getValue());
                    }
                    break;
                }
                default -> {
                    System.out.println("error");
                    return;
                }
            }
        }
    }
}

 

반복자를 사용하는 예문도 참조해 보았다.