먼저 수포자마다 문제를 찍는 규칙을 정리해야 한다.
1번 | 1, 2, 3, 4, 5 |
2번 | 2, 1, 2, 3, 2, 4, 2, 5 |
3번 | 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 |
int[] rules1 = {1, 2, 3, 4, 5};
int[] rules2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] rules3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
주어진 문제의 정답과 각각의 규칙을 비교하면서 맞힌 개수를 세야 하는데,
규칙마다 개수가 달라 문제의 수가 많은 경우, ArrayIndexOutOfBoundsException이 발생할 수 있다.
문제를 모두 비교할 때까지 규칙의 사이클이 돌 수 있도록 따로 인덱스를 설정해줘야 한다.
문제 개수를 기준으로 반복문이 돌 때마다 규칙 전용 인덱스값을 증가시키고,
인덱스가 각 규칙의 개수에 도달하면 0으로 초기화해 준다.
int[] scores = new int[3];
int idx1 = 0, idx2 = 0, idx3 = 0; // 각 규칙의 전용 인덱스
for (int i = 0; i < answers.length; i++) {
if (answers[i] == rules[idx1]) scores[0]++;
if (answers[i] == rules[idx2]) scores[1]++;
if (answers[i] == rules[idx3]) scores[2]++;
idx1++;
idx2++;
idx3++;
if (idx1 == rules1.length) idx1 = 0;
if (idx2 == rules2.length) idx2 = 0;
if (idx3 == rules3.length) idx3 = 0;
}
여기까지 코드를 작성하고 scores를 출력해 보면, 수포자마다 문제를 맞힌 개수가 출력된다.
- 첫 번째 입출력 : [5, 0 , 0]
- 두 번째 입출력 : [2, 2, 2]
scores에서 가장 큰 값(max)을 구하고, 반복문을 돌면서 max와 같은 값 즉, 문제를 가장 많이 맞힌 수포자를 찾아 배열에 저장한다.
수포자마다 문제를 맞힌 갯수가 동일하다면 모두 저장한다.
int max = Math.max(scores[0], Math.max(scores[1], scores[2]));
List<Integer> answer = new ArrayList<>();
for (int i = 0; i < scores.length; i++) {
if (scores[i] == max) answer.add(i + 1);
}
맞힌 갯수가 동일한 경우, 오름차순으로 정렬해서 출력해야 한다.
하지만 이미 1번부터 순차적으로 저장되었기 때문에 따로 정렬해주지 않아도 된다.
최종 코드
import java.util.ArrayList;
import java.util.List;
class Solution {
public List<Integer> solution(int[] answers) {
int[] rules1 = {1, 2, 3, 4, 5};
int[] rules2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] rules3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int[] scores = new int[3];
int idx1 = 0, idx2 = 0, idx3 = 0;
for (int i = 0; i < answers.length; i++) {
if (answers[i] == rules1[idx1]) scores[0]++;
if (answers[i] == rules2[idx2]) scores[1]++;
if (answers[i] == rules3[idx3]) scores[2]++;
idx1++;
idx2++;
idx3++;
if (idx1 == rules1.length) idx1 = 0;
if (idx2 == rules2.length) idx2 = 0;
if (idx3 == rules3.length) idx3 = 0;
}
int max = Math.max(scores[0], Math.max(scores[1], scores[2]));
List<Integer> answer = new ArrayList<>();
for (int i = 0; i < scores.length; i++) {
if (scores[i] == max) answer.add(i + 1);
}
return answer;
}
}
기존 문제의 반환 타입은 int []이지만 List로 설정해도 통과할 수 있다.
만약 문제 반환 타입인 int []로 하게 된다면 int []의 크기 초기화, 값 매핑과 관련된 코드를 추가해줘야 한다.
int[] result = new int[answer.size()];
for (int i = 0; i < result.length; i++) {
result[i] = answer.get(i);
}
return result;
굳이 필요하지 않은 작업이라 생각하여 반환타입을 List로 변경하여 제출했다.
프로그래머스 - 모의고사
https://school.programmers.co.kr/learn/courses/30/lessons/42840?language=java
'코딩테스트 > 99클럽 4기' 카테고리의 다른 글
99클럽 코딩 테스트 22일차 TIL (1) | 2024.11.18 |
---|---|
99클럽 코테 스터디 21일차 TIL (0) | 2024.11.17 |
99클럽 코테 스터디 19일차 TIL (1) | 2024.11.15 |
99클럽 코테 스터디 18일차 TIL (2) | 2024.11.14 |
99클럽 코테 스터디 17일차 TIL (0) | 2024.11.13 |