✔ 모의고사
문제 분석하기
1번 수포자는 1에서 5를 순서대로 반복해서 찍는 방식 (1, 2, 3, 4, 5)
2번 수포자는 2를 제외한 1, 3, 4, 5를 2 다음에 반복해서 찍는 방식 (2, 1, 2, 3, 2, 4, 2, 5)
3번 수포자는 3-1-2-4-5 순서대로 2번씩 반복해서 찍는 방식 (3, 3, 1, 1, 2, 2, 4, 4, 5, 5)
각 수포자가 찍는 방식의 최소 단위에 대해 반복하며 answer와 비교하여 점수를 매기도록 완전 탐색
손으로 풀어보기
- 세 명의 수포자들 찍는 방식의 최소 단위에 대한 배열 작성
- 각 수포자들마다 완전 탐색하며 점수를 매김
- 최고 점수 찾기
- 최고 점수를 가지는 수포자들을 반환
슈도코드 작성하기
answers(1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열)
first(1번 수포자의 찍는 방식)
second(2번 수포자의 찍는 방식)
third(3번 수포자의 찍는 방식)
score(3명의 수포자의 점수)
for(answer의 길이만큼) {
first, second, third에 따라 정답을 맞춘다면 점수 증가
}
score에서 최대 점수 찾기
최대 점수를 가진 수포자들의 배열 반환
코드 구현하기
/**
* 42940) 모의고사
*/
public class K002_42940 {
// answers(1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열)
public int[] solution(int[] answers) {
// first(1번 수포자의 찍는 방식)
int[] first = { 1, 2, 3, 4, 5 };
// second(2번 수포자의 찍는 방식)
int[] second = { 2, 1, 2, 3, 2, 4, 2, 5 };
// third(3번 수포자의 찍는 방식)
int[] third = { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 };
// score(3명의 수포자의 점수)
int[] score = new int[3];
// first, second, third에 따라 정답을 맞춘다면 점수 증가
for (int i = 0; i < answers.length; i++) {
if (answers[i] == first[i % 5])
score[0]++;
if (answers[i] == second[i % 8])
score[1]++;
if (answers[i] == third[i % 10])
score[2]++;
}
// score에서 최대 점수 찾기
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);
}
int[] answer = new int[list.size()];
for (int i = 0; i < answer.length; i++) {
answer[i] = list.get(i);
}
return answer;
}
// 테스트 케이스
public static void main(String[] args) {
K002_42940 solution = new K002_42940();
int[] answers = { 1, 2, 3, 4, 5 };
int[] result = solution.solution(answers);
System.out.println(Arrays.toString(result));
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[43105] 정수 삼각형 (0) | 2023.11.07 |
---|---|
[42860] 조이스틱 (0) | 2023.11.06 |
[42746] 가장 큰 수 (0) | 2023.11.05 |
[42627] 디스크 컨트롤러 (0) | 2023.11.05 |
[12909] 올바른 괄호 (0) | 2023.11.04 |