각 수포자의 반복 답안 패턴을 실제 정답 배열과 비교해 가장 많이 맞힌 사람을 구하는 문제
1. 문제 유형
구현, 배열, 완전탐색
2. 내가 놓친 포인트
처음 떠올린 접근 : 각 학생의 찍는 패턴을 배열로 만들어서 비교하려고 했다.
오답 원인: 패턴 배열의 길이보다 문제가 더 많아졌을 때 배열 끝 이후를 어떻게 다시 처음부터 비교해야 하는지 바로 떠올리지 못했다.
3. 핵심 로직 & 해결 방법
핵심 조건: 각 학생은 정해진 패턴대로 반복해서 답을 찍는다.
따라서 현재 문제 번호 i에서 각 학생의 답은 i % 패턴길이로 구할 수 있다.
풀이 아이디어:
- 1번, 2번, 3번 학생의 답 패턴을 각각 배열로 만든다.
- answers를 순회하면서 answers[i]와 student[i % student.length]를 비교해 학생별 점수를 센다.
- 세 학생의 점수 중 최댓값을 구한 뒤, 그 점수와 같은 학생 번호를 결과 배열에 담아 반환한다.
4. 구현 코드
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int[] scores = new int[3];
int[] student1 = {1, 2, 3, 4, 5};
int[] student2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] student3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
for (int i = 0; i < answers.length; i++) {
if (answers[i] == student1[i % student1.length]) {
scores[0]++;
}
if (answers[i] == student2[i % student2.length]) {
scores[1]++;
}
if (answers[i] == student3[i % student3.length]) {
scores[2]++;
}
}
int max = Math.max(scores[0], Math.max(scores[1], scores[2]));
List<Integer> result = new ArrayList<>();
for (int i = 0; i < scores.length; i++) {
if (scores[i] == max) {
result.add(i + 1);
}
}
int[] answer = new int[result.size()];
for (int i = 0; i < result.size(); i++) {
answer[i] = result.get(i);
}
return answer;
}
}
시간 복잡도: O(N) / 공간 복잡도: O(1)
인사이트
- 반복되는 패턴이 나오면 배열을 직접 늘리는 게 아니라 나머지 연산으로 순환 접근할 수 있다는 점을 기억해야겠다.
문제 출처 - https://school.programmers.co.kr/learn/courses/30/lessons/42840
'Problem Solving' 카테고리의 다른 글
| [Java] 프로그래머스 - 로또의 최고 순위와 최저 순위 (0) | 2026.04.23 |
|---|---|
| [Java] 프로그래머스 - 택배상자 (0) | 2026.04.22 |
| [Java] 프로그래머스 - 체육복 (0) | 2026.04.20 |
| [Java] 프로그래머스 - 타겟 넘버 (0) | 2026.04.17 |
| [Java] 프로그래머스 - 소수 찾기 (0) | 2026.04.17 |