코딩테스트/프로그래머스
[코딩테스트] Java 모의고사
[dev] hiro
2024. 11. 13. 00:36
제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
Programmers 알고리즘 고득점 Kit입니다.
포인트
모의고사를 제일 많이 맞춘 사람을 구하는 문제입니다. 각 수포자가 규칙이 있으니 문제 번호에 패턴의 길이만큼의 나머지로 문제를 푸는 방법으로 구현하였습니다.
소스코드
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int[][] omr = {
{1, 2, 3, 4, 5},
{2, 1, 2, 3, 2, 4, 2, 5},
{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
};
int[] correctCount = new int[3]; // 정답 수를 저장할 배열
for (int i = 0; i < answers.length; i++) {
for (int j = 0; j < 3; j++) {
if (omr[j][i % omr[j].length] == answers[i]) {
correctCount[j]++;
}
}
}
// 최대 정답 수 찾기
int maxCorrect = Arrays.stream(correctCount).max().getAsInt();
// 최대 정답 수와 일치하는 사람을 리스트에 추가
List<Integer> answer = new ArrayList<>();
for (int i = 0; i < 3; i++) {
if (correctCount[i] == maxCorrect) {
answer.add(i + 1); // 사람 번호는 1부터 시작하므로 i + 1
}
}
return answer.stream().mapToInt(Integer::intValue).toArray();
}
}
코드 설명
- int[][] omr
- omr 배열은 각 수포자가 문제를 푸는 패턴을 저장합니다.
- 각 수포자는 해당 배열에 정의된 주기를 반복하여 답을 제출합니다.
- int[] correctCount = new int[3];
correctCount는 각 수포자가 맞힌 문제의 수를 저장하는 배열입니다. - for (int num: nums) { ponkets.put(num, ponkets.getOrDefault(num, 0) + 1); }
nums 배열을 순회하면서 각 숫자가 ponkets 맵에 이미 존재하는지 확인합니다.- 존재하면 해당 숫자의 값에 +1을 합니다.
- 존재하지 않으면 기본값 0에서 +1을 하여 새로운 키-값 쌍으로 추가합니다.
- for (int i = 0; i < answers.length; i++) {
for (int j = 0; j < 3; j++) {
if (omr[j][i % omr[j].length] == answers[i]) {
correctCount[j]++; } } }
- 외부 for 루프는 주어진 answers 배열을 순회하면서, 각 문제의 정답을 확인합니다.
- 내부 for 루프는 각 수포자의 답안 패턴을 현재 문제 번호에 맞게 가져옵니다. i % omr[j].length를 사용하여 패턴의 길이에 맞게 인덱스를 순환시킵니다.
- 만약 해당 수포자의 답이 실제 answers의 답과 일치한다면, 그 수포자의 correctCount 값을 증가시킵니다.
- int maxCorrect = Arrays.stream(correctCount).max().getAsInt();
correctCount 배열에서 가장 높은 정답 수를 찾아 maxCorrect에 저장합니다. - 가장 높은 정답 수를 가진 수포자의 번호를 찾고, answer 리스트에 추가합니다. 사람 번호는 1부터 시작하므로 i + 1을 사용합니다.
- return answer.stream().mapToInt(Integer::intValue).toArray();
answer 리스트를 정수 배열로 변환하여 반환합니다.