프로그래머스 고득점 Kit · 완전탐색 · Lv.1
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/42840
수포자 세 명이 각자 정해진 규칙으로 answer를 찍는다. 정답 배열이 주어질 때 가장 많이 맞힌 사람의 번호를 구하면 된다.
1, 2, 3, 4, 5 반복 (주기 5)2, 1, 2, 3, 2, 4, 2, 5 반복 (주기 8)3, 3, 1, 1, 2, 2, 4, 4, 5, 5 반복 (주기 10)제한 조건
주기를 어떻게 다룰 것인가 고민했었다. 세 사람의 패턴 주기가 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번 순서로 검사하면 결과가 오름차순으로 쌓인다.
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;
}
}