Day22

강태훈·2026년 1월 28일

nbcamp TIL

목록 보기
22/58

자료구조 및 알고리즘

ch1 추가문제 1번

문제

음악 테스트 응시자의 패턴

3명의 음악 테스트 응시자들이 음계 맞추기 시험을 봅니다. 각 응시자들은 자신만의 패턴으로 답을 찍어서 문제를 풀기로 했습니다. 이번 시험에서 누가 가장 많은 문제를 맞혔는지 알아보려 합니다.

응시자 3명의 찍기 패턴

(1) 1번 응시자의 패턴: [,,,]
    * 4개의 음계를 순차적으로 반복
    * ex),,,,,,,,,,...

(2) 2번 응시자의 패턴: [,,,,,]
    * 6개의 음계를 순차적으로 반복
    * ex),,,,,,,,,,...

(3) 3번 응시자의 패턴: [,,,,,]
    * 6개의 음계를 순차적으로 반복
    * ex),,,,,,,,,,...

시험문제의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지를 배열에 담아 return 하는 함수를 작성해주세요.

제한사항

  • 시험은 최대 5,000 문제로 구성되어있습니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

입력 형식 및 예시

  • 첫째 줄: 시험 문제의 개수 N (1 ≤ N ≤ 5,000)
  • 둘째 줄: N개의 정답 문자열이 공백으로 구분되어 주어짐 (각 문자열은 "도", "레", "미", "파" 중 하나)
// 예시 1
6
도 레 미 파 도 레

// 예시 2
6
미 레 도 레 도 미

출력 형식

  • 가장 높은 점수를 받은 응시자의 번호를 공백으로 구분하여 오름차순으로 출력
// 예시 1
1

// 예시 2
1 2

예시 상황 설명

각 응시의 점수를 계산해 가장 높은 점수의 사람을 반환하면 됩니다.

예시 1의 입력이 ["도", "레", "미", "파", "도", "레"]이므로 :

  • 1번 응시자: 도✅ 레✅ 미✅ 파✅ 도✅ 레✅ (6점)
  • 2번 응시자: 레❌ 레✅ 파❌ 파✅ 도✅ 도❌ (3점)
  • 3번 응시자: 미❌ 파❌ 미✅ 도❌ 레❌ 도❌ (1점)

1번 응시자가 6점으로 가장 높은 점수를 갖게 됩니다. 따라서 1 을 출력합니다.

예시 2의 입력이 ["미", "레", "도", "레", "도", "미"]이므로 :

1번 응시자: 도❌ 레✅ 미❌ 파❌ 도✅ 레❌ (2점)

2번 응시자: 레❌ 레✅ 파❌ 파❌ 도✅ 도❌ (2점)

3번 응시자: 미✅ 파❌ 미❌ 도❌ 레❌ 도❌ (1점)

1번, 2번 응시자가 2점으로 가장 높은 점수이고 동점이므로 오름 차순으로 1 2로 출력해야 합니다.


내 코드


main

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        char solution;

        System.out.print("문제 개수 입력: ");
        int count = sc.nextInt();
        // 문제 개수 입력

        if(count < 1){
            throw new IllegalArgumentException("개수가 너무 적습니다.");
        } else if (count > 5000) {
            throw new IllegalArgumentException("개수가 너무 많습니다.");
        }// 전제조건: 1~5000개 사이

        String[] solutions = new String[count];
        for(int i = 0; i < solutions.length; i++){
            solution = sc.next().charAt(0); // '도레' 같이 두 글자가 저장되는 것을 방지
            if(solution != '도' && solution != '레' && solution != '미' && solution != '파'){
                throw new IllegalArgumentException("문제에 주어지지 않은 음계입니다.");
            }// 도,레,미,파 중 하나의 음계 사용
            solutions[i] = String.valueOf(solution);
        }

Tester.tester(solutions);

tester

public class Tester {
    public static void tester(String[] solutions){
        String[] tester1 = {"도", "레", "미", "파"};
        String[] tester2 = {"레", "레", "파", "파", "도", "도"};
        String[] tester3 = {"미", "파", "미", "도", "레", "도"};

        int[] testerScore = {0,0,0};

        for(int i = 0; i < solutions.length; i++){
            if(tester1[i % tester1.length].equals(solutions[i])){
                testerScore[0] ++;
            }
            if(tester2[i % tester2.length].equals(solutions[i])){
                testerScore[1] ++;
            }
            if(tester3[i % tester3.length].equals(solutions[i])){
                testerScore[2] ++;
            }
        }// 비교해서 점수 추가


        int max = Math.max(testerScore[0],testerScore[1]);
        if(max < testerScore[2]) {
            max = testerScore[2];
        }// 최댓값 구하기


        int finalMax = max;
        IntStream.range(0, testerScore.length)
                .filter(j -> testerScore[j] == finalMax)
                .forEach(j -> System.out.print(j+1 + " "));
		// 최댓값 위치 찾아서 출력
    }
}

0개의 댓글