728x90
📌 문제 개요
수포자 3명이 각각 다른 패턴으로 문제를 찍는다.
정답 배열이 주어졌을 때 가장 많은 문제를 맞힌 사람의 번호를 반환하는 문제이다.
동점자가 여러 명인 경우 오름차순으로 모두 반환해야 한다.
📌 접근 방법
각 수포자의 찍는 패턴을 배열로 저장한다.
문제 수는 패턴 길이보다 길 수 있으므로 % 연산을 사용해 패턴을 반복한다.
int[] p1 = {1, 2, 3, 4, 5};
int[] p2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] p3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
각 문제마다 정답과 비교하여 맞힌 개수를 저장한다.
모든 문제를 확인한 뒤 가장 높은 점수를 찾고, 해당 점수를 가진 사람을 결과에 담는다.
p1[i % p1.length]
📌 핵심 아이디어
1. 패턴 반복
예를 들어 패턴 길이가 5일 때 패턴이 자동으로 반복된다.
p1[i % p1.length]
i = 0 → p1[0]
i = 1 → p1[1]
i = 2 → p1[2]
i = 3 → p1[3]
i = 4 → p1[4]
i = 5 → p1[0]
2. 점수 계산
각 수포자의 정답 개수를 저장한다.
if (answers[i] == p1[i % p1.length]) score[0]++;
if (answers[i] == p2[i % p2.length]) score[1]++;
if (answers[i] == p3[i % p3.length]) score[2]++;
3. 최고 점수 찾기
최고 점수를 구한 후
int max = Math.max(score[0],
Math.max(score[1], score[2]));
조건으로 동점자를 모두 결과에 추가한다.
if(score[i] == max)
📌 전체 코드
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int[] p1 = {1, 2, 3, 4, 5};
int[] p2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] p3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int[] score = new int[3];
for (int i = 0; i < answers.length; i++) {
if (answers[i] == p1[i % p1.length]) score[0]++;
if (answers[i] == p2[i % p2.length]) score[1]++;
if (answers[i] == p3[i % p3.length]) score[2]++;
}
int max = Math.max(score[0],
Math.max(score[1], score[2]));
List<Integer> list = new ArrayList<>();
for (int i = 0; i < score.length; i++) {
if (score[i] == max) {
list.add(i + 1);
}
}
return list.stream()
.mapToInt(Integer::intValue)
.toArray();
}
}
📄 정리
- 반복되는 패턴은 % 연산으로 처리한다.
- 각 수포자의 정답 개수를 카운트한다.
- 최고 점수를 찾고 동점자를 모두 반환한다.
- 완전탐색 구현 문제이지만 % 연산을 활용하는 것이 핵심이다.
728x90
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
| 프로그래머스 문자열 나누기 JAVA 풀이 (문자열, 구현) (0) | 2026.06.09 |
|---|---|
| 프로그래머스 비밀지도 JAVA 풀이 (비트연산, 문자열 변환) (0) | 2026.06.09 |
| 프로그래머스 명예의 전당 (1) JAVA 풀이 (우선순위 큐, PriorityQueue) (0) | 2026.06.05 |
| 프로그래머스 콜라 JAVA 풀이 (구현, 시뮬레이션) (0) | 2026.06.04 |
| 카드 뭉치 JAVA 풀이 (구현, 문자열) (0) | 2026.06.03 |