문제 설명
수포자들은 각자 고유한 패턴으로 문제를 풀고, 주어진 정답 배열과 비교하여 가장 많은 문제를 맞힌 사람을 찾는 문제다.
수포자마다 패턴이 다르고, 정답 배열을 기준으로 비교하여 가장 많은 문제를 맞힌 사람을 찾아야 한다.
만약 여러 명이 동일한 점수를 얻으면 오름차순으로 그 사람들의 번호를 반환해야 한다.
문제를 풀 때 중요한 점은 각 수포자마다 주어진 답안을 따라 패턴을 생성한다는 것이다.
패턴의 길이가 다르기 때문에, 문제 인덱스를 사용해 패턴을 반복해야 한다는 점을 생각해야 했다.
각 수포자의 패턴을 기반으로 정답을 비교하고, 가장 높은 점수를 얻은 사람을 찾아 반환하면 된다.
처음에는 비교하는 부분에서 "패턴의 길이를 고려해서 반복하는 방식"을 놓쳐서 헷갈렸는데,
`i % pattern[j].length`를 사용해 각 패턴을 적절히 반복하도록 했더니 해결됐다.
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
public int[] solution(int[] answers) {
// 수포자들의 패턴
int[][] pattern = {
{1,2,3,4,5},
{2,1,2,3,2,4,2,5},
{3,3,1,1,2,2,4,4,5,5}
};
// 수포자들의 점수를 저장할 배열
int[] scores = new int[3];
// 각 수포자의 패턴과 정답이 얼마나 일치하는지 확인
for(int i = 0; i < answers.length; i++) {
for(int j = 0; j < pattern.length; j++) {
// 정답이 수포자의 답안 패턴보다 긴 경우 패턴의 처음과 다시 비교하도록 나머지 연산자 사용
if(answers[i] == pattern[j][i % pattern[j].length]) {
scores[j]++;
}
}
}
// 가장 높은 점수 저장
int maxScore = Arrays.stream(scores).max().getAsInt();
// 가장 높은 점수를 가진 수포자들의 번호를 찾아서 리스트에 저장 (몇 명일지 모르니 리스트 사용)
ArrayList answer = new ArrayList<>();
for(int i = 0; i < scores.length; i++) {
// 동점이 있을 수 있으므로 최댓값과 비교하는 방식 사용
if(scores[i] == maxScore) {
// 오름차순으로 저장
answer.add(i + 1);
}
}
// int[] 형태로 변환
return answer.stream().mapToInt(Integer::intValue).toArray();
}
}
돌아보며..
문제를 풀 때 수포자들의 패턴을 반복하는 방식에서 i % pattern[j].length를 사용해야 한다는 점을 놓쳐서 처음에 실수를 했다.
패턴이 반복되기 때문에 그 부분을 나머지 연산을 사용하여 해결해야 하는데, 이를 놓치면 오류가 발생한다.
그 외에도 여러 명이 동일한 점수를 얻었을 때, 오름차순으로 정렬해서 반환하는 부분에서 리스트를 사용하여 처리했다.
이 문제를 통해 패턴이 주어지고 반복적으로 사용되는 문제에서는 나머지 연산을 잘 활용하는 것이 중요하다는 점을 배웠다.
또 동점자가 있을 때 리스트를 사용하여 동적 크기로 처리하는 방법도 유용하다는 걸 알았다.
댓글
댓글 작성은 로그인 후에 가능합니다.