[PRGM] 42840.모의고사 (Java)

Jun·2026년 7월 27일

알고리즘

목록 보기
2/11

프로그래머스 고득점 Kit · 완전탐색 · Lv.1
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/42840

1. 문제 요약

수포자 세 명이 각자 정해진 규칙으로 answer를 찍는다. 정답 배열이 주어질 때 가장 많이 맞힌 사람의 번호를 구하면 된다.

  • 1번: 1, 2, 3, 4, 5 반복 (주기 5)
  • 2번: 2, 1, 2, 3, 2, 4, 2, 5 반복 (주기 8)
  • 3번: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 반복 (주기 10)

제한 조건

  • 문제 수는 최대 10,000
  • 정답은 1~5
  • 최고점이 여러 명이면 오름차순 정렬해서 반환

2. 접근 과정

주기를 어떻게 다룰 것인가 고민했었다. 세 사람의 패턴 주기가 5, 8, 10으로 제각각이다. 처음엔 세 배열의 길이를 맞춰야 하나 싶었지만 각 배열이 자기 길이로 나머지 연산을 하면 된다.

answer1[i % answer1.length]   // i % 5
answer2[i % answer2.length]   // i % 8
answer3[i % answer3.length]   // i % 10

i는 전체 문제 번호로 계속 증가하지만, 각자 자기 주기로 나눈 나머지를 쓰면 알아서 자기 패턴의 제자리를 가리킨다.
1번 → 2번 → 3번 순서로 검사하면 결과가 오름차순으로 쌓인다.

3. 코드

class Solution {
 
  public int[] solution(int[] answers) {
 
    int supoza1 = 0, supoza2 = 0, supoza3 = 0;
    int[] answer1 = new int[]{1, 2, 3, 4, 5};
    int[] answer2 = new int[]{2, 1, 2, 3, 2, 4, 2, 5};
    int[] answer3 = new int[]{3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
 
    for (int i = 0; i < answers.length; i++) {
      if (answers[i] == answer1[i % answer1.length]) {
        supoza1++;
      }
      if (answers[i] == answer2[i % answer2.length]) {
        supoza2++;
      }
      if (answers[i] == answer3[i % answer3.length]) {
        supoza3++;
      }
    }
 
    int max = Math.max(supoza1, Math.max(supoza2, supoza3));
 
    int count = 0;
    if (supoza1 == max) count++;
    if (supoza2 == max) count++;
    if (supoza3 == max) count++;
 
    int[] answer = new int[count];
    int index = 0;
 
    if (supoza1 == max) answer[index++] = 1;
    if (supoza2 == max) answer[index++] = 2;
    if (supoza3 == max) answer[index] = 3;
 
    return answer;
  }
}
profile
꾸준하게

0개의 댓글