Experience/항해99 18기

Java 문법 1주차 숙제

chillmyh 2023. 11. 21. 04:06

1주차 숙제 내용

💁‍♀️ 요리 레시피 메모장 만들기

입력값

  • 내가 좋아하는 요리 제목을 먼저 입력합니다.
  • 요리 별점을 1~5 사이의 소수점이 있는 실수로 입력해주세요. (ex. 3.5)
  • 이어서 내가 좋아하는 요리 레시피를 한 문장씩 10문장을 입력합니다.

 출력값

  • 입력이 종료되면 요리 제목을 괄호로 감싸서 먼저 출력 해줍니다.
  • 이어서, 요리 별점을 소수점을 제외한 정수로만 출력해줍니다. (ex. 3)
  • 바로 뒤에 정수별점을 5점만점 퍼센트로 표현했을 때 값을 실수로 출력해줍니다. (ex. 60.0%)
  • 이어서, 입력한 모든 문장 앞에 번호를 붙여서 모두 출력 해줍니다.

 

첫번째 답안

public class Main {

    public static void main(String[] args) {
        System.out.println("[ " + "닭도리탕 만들기" + " ]"); // 요리 제목

        double dfoodScore = 4.3;
        double maxScore = 5.0; // 5점 만점
        int ifoodScore;
        ifoodScore = (int)dfoodScore; // 4.3 -> 4
        double percentScore = (4.3 / 5.0) * 100;

        System.out.println(dfoodScore + " (" + percentScore + "%" + ")");

        System.out.println("1. 닭과 각종 채소를 손질하여 준비합니다.");
        System.out.println("2. 냄비에 물을 끓여 기름기를 제거한 닭고기를 넣고 익힙니다.");
        System.out.println("3. 끓는 물에 닭을 넣고 5-10분간 데칩니다.");
        System.out.println("4. 닭을 뺀 후 냄비에 식용유를 두르고 다진 마늘, 다진 생강을 볶습니다.");
        System.out.println("5. 고추장과 고춧가루를 넣고 함께 볶아 양념을 만듭니다.");
        System.out.println("6. 데친 닭과 채소를 함께 넣고 끓입니다.");
        System.out.println("7. 다진 파, 대파를 넣고 양념이 고루 배어들도록 섞어줍니다.");
        System.out.println("8. 감자, 당근 등 추가적인 채소를 넣고 끓입니다.");
        System.out.println("9. 맛을 낼 목적으로 소금, 후추 등으로 간을 맞춥니다.");
        System.out.println("10. 재료가 잘 익고 국물이 어우러지면 완성된 닭도리탕을 그릇에 담아 마무리합니다.");
    }
}

 

출력 결과는 같았으나 정답 확인 결과 내가 문제를 잘못 이해한 것을 알았다.

문제에서는 직접 입력해야 했던 것.

 

힌트를 보며 새로 작성하다가 println으로 출력해 체크해보려했는데 

 

Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextFloat(Scanner.java:2496)
at Main.main(Main.java:8)

 

라는 에러가 뜨며 요리제목 입출력단계에서 에러가 나버렸다.

새로 작성한 코드가 문제인가 싶어 고민하다가 정답코드로 다시 입력해보았는데도 동일한 에러가 나왔다.

 

-> 해결

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String title = sc.nextLine();
        float rate = sc.nextFloat(); // Float 실수는 nextFloat() 메서드로 받습니다.
        String input1 = sc.nextLine();
        String input2 = sc.nextLine();
        String input3 = sc.nextLine();
        String input4 = sc.nextLine();
        String input5 = sc.nextLine();
        String input6 = sc.nextLine();
        String input7 = sc.nextLine();
        String input8 = sc.nextLine();
        String input9 = sc.nextLine();
        String input10 = sc.nextLine();

        System.out.println("[ " + title + " ]");
        int intRate = (int)rate;
        double perRate = 100 * intRate / 5;
        System.out.print(intRate);
        System.out.println(" (" + perRate + "%)");
        System.out.println("1. " + input1);
        System.out.println("2. " + input2);
        System.out.println("3. " + input3);
        System.out.println("4. " + input4);
        System.out.println("5. " + input5);
        System.out.println("6. " + input6);
        System.out.println("7. " + input7);
        System.out.println("8. " + input8);
        System.out.println("9. " + input9);
        System.out.println("10. " + input10);
    }
}

 

위의 에러가 났던 이유는 next()라고만 썻던걸 nextline()이라고 고쳐서 해결했음.

 

입력

알리오 올리오
3.8
불을 올리고
저또 어쩌구
저쩌구
이런
저런
요롷게
저렇게
뜨겁게
맛있게

출력
[ 알리오 올리오 ]
3 (60.0%)
1. 
2. 불을 올리고
3. 저또 어쩌구
4. 저쩌구
5. 이런
6. 저런
7. 요롷게
8. 저렇게
9. 뜨겁게
10. 맛있게

 

출력 상태를 보면 자꾸 1. 이 비고 9번째 레시피 입력에서 끝나고 바로 출력으로 넘어가 9번째가 10번째가 되서 출력이 됐다.

질문하고 수정해야겠음.

 

 

-> 재 수정 !! 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String title = sc.nextLine();
        float rate = sc.nextFloat(); // Float 실수는 nextFloat() 메서드로 받습니다.
        String errorCut = sc.nextLine();
        String input1 = sc.nextLine();
        String input2 = sc.nextLine();
        String input3 = sc.nextLine();
        String input4 = sc.nextLine();
        String input5 = sc.nextLine();
        String input6 = sc.nextLine();
        String input7 = sc.nextLine();
        String input8 = sc.nextLine();
        String input9 = sc.nextLine();
        String input10 = sc.nextLine();

        System.out.println("[ " + title + " ]");
        int intRate = (int)rate;
        double perRate = 100 * intRate / 5;
        System.out.println(intRate + " (" + perRate + "%)");
        System.out.println("1. " + input1);
        System.out.println("2. " + input2);
        System.out.println("3. " + input3);
        System.out.println("4. " + input4);
        System.out.println("5. " + input5);
        System.out.println("6. " + input6);
        System.out.println("7. " + input7);
        System.out.println("8. " + input8);
        System.out.println("9. " + input9);
        System.out.println("10. " + input10);
    }
}

 

입력

알리오 올리오
3.8
1
2
3
4
5
6
7
8
9
10

출력
[ 알리오 올리오 ]
3 (60.0%)
1. 1
2. 2
3. 3
4. 4
5. 5
6. 6
7. 7
8. 8
9. 9
10. 10

입 출력을 해보면 정상적으로 번호가 밀리지 않고 잘 매겨서 나온다!

매니저님께 답변을 들어서 수정했는데, 방법은

nextFloat(); 다음 코드로 바로 nextLine(); 이 오면 씹히는 문제가 Scanner의 고질적인 문제라 하셨다.

그래서 임의로 errorCut 이라는 변수를 (실제로 실행되지는 않음) 넣어 nextLine();을 넣고 씹힘 현상을 상쇄했다.