✏️오늘의 문제
public int[] solution(int[] answers) {
int[] first = {1,2,3,4,5};
int[] second = {2,1,2,3,2,4,2,5};
int[] third = {3,3,1,1,2,2,4,4,5,5};
int cnt1 = 0;
int cnt2 = 0;
int cnt3 = 0;
for (int i=0; i<answers.length; i++) {
if (answers[i] == first[i%5]) {
cnt1++;
}
if (answers[i] == second[i%8]) {
cnt2++;
}
if (answers[i] == third[i%10]) {
cnt3++;
}
}
if (cnt1 > cnt2 && cnt1 > cnt3) {
int[] answer = new int[1];
answer[0] = 1;
return answer;
} else if (cnt2 > cnt1 && cnt2 > cnt3) {
int[] answer = new int[1];
answer[0] = 2;
return answer;
} else if (cnt3 > cnt1 && cnt3 > cnt2) {
int[] answer = new int[1];
answer[0] = 3;
return answer;
} else if (cnt1 == cnt2 && cnt1 > cnt3) {
int[] answer = new int[2];
answer[0] = 1;
answer[1] = 2;
return answer;
} else if (cnt2 == cnt3 && cnt2 > cnt1) {
int[] answer = new int[2];
answer[0] = 2;
answer[1] = 3;
return answer;
} else if (cnt3 == cnt1 && cnt3 > cnt2) {
int[] answer = new int[2];
answer[0] = 1;
answer[1] = 3;
return answer;
} else {
int[] answer = new int[3];
answer[0] = 1;
answer[1] = 2;
answer[2] = 3;
return answer;
}
}
이 코드는 프로그래밍 문제인 "모의고사"를 해결하기 위한 풀이입니다. 주어진 답안(answers
)에 대해 세 명의 수험생(1번, 2번, 3번)이 각각 몇 문제를 맞혔는지를 계산하고, 가장 많이 맞힌 수험생의 번호를 반환하는 방식입니다.
수험생의 답안 패턴 정의
first
, second
, third
배열은 각 수험생이 문제를 푸는 방식입니다. 각각 1번, 2번, 3번 수험생의 답안 패턴을 정의합니다.정답 개수 카운트
cnt1
, cnt2
, cnt3
변수를 통해 각 수험생이 맞춘 문제 수를 카운트합니다.for
루프를 사용하여 answers
배열을 순회하며 각 수험생의 패턴에 맞춰 정답을 비교하고 카운트합니다.결과 반환
명확한 구조: 코드가 명확하게 구조화되어 있어, 각 수험생의 답안 패턴과 카운트 과정이 쉽게 이해됩니다.
효율성: 입력 배열을 한 번만 순회하여 답을 계산하므로 시간 복잡도가 O(n)입니다. 이는 매우 효율적인 접근 방식입니다.
유연성: 수험생의 수나 답안 패턴을 변경하기 쉽습니다. 배열만 수정하면 추가적인 변경 없이도 확장할 수 있습니다.
중복 코드: 결과를 반환하는 부분에서 중복 코드가 많이 발생합니다. 동점 검사와 반환하는 과정이 반복되고 있어, 코드가 길어지고 가독성이 떨어질 수 있습니다.
배열 크기 고정: 수험생의 수가 늘어나면 배열 크기를 동적으로 조정해야 하는데, 현재 구현은 이를 고려하지 않았습니다. 예를 들어, 수험생이 4명 이상일 경우 코드를 수정해야 합니다.
가독성: 조건문이 많아지면서 가독성이 떨어질 수 있습니다. 특히, 동점인 경우를 처리하는 조건문이 복잡해 보입니다.
동적 배열 사용: 수험생의 수를 동적으로 처리하기 위해 ArrayList
와 같은 동적 배열을 사용할 수 있습니다.
중복 코드 제거: 결과 반환 부분을 함수로 분리하여 중복을 줄이고 가독성을 높일 수 있습니다.
주석 추가: 각 단계에 설명 주석을 추가하여 다른 사람이 코드를 이해하는 데 도움이 될 수 있습니다.
import java.util.ArrayList;
import java.util.List;
public int[] solution(int[] answers) {
int[] first = {1, 2, 3, 4, 5};
int[] second = {2, 1, 2, 3, 2, 4, 2, 5};
int[] third = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int[] counts = new int[3]; // 세 수험생의 정답 개수를 저장
for (int i = 0; i < answers.length; i++) {
if (answers[i] == first[i % first.length]) counts[0]++;
if (answers[i] == second[i % second.length]) counts[1]++;
if (answers[i] == third[i % third.length]) counts[2]++;
}
// 최대 점수를 찾기
int maxCount = Math.max(counts[0], Math.max(counts[1], counts[2]));
// 최대 점수를 가진 수험생 번호를 저장할 리스트
List<Integer> resultList = new ArrayList<>();
for (int i = 0; i < counts.length; i++) {
if (counts[i] == maxCount) {
resultList.add(i + 1); // 수험생 번호는 1부터 시작하므로 i + 1
}
}
// 결과 리스트를 배열로 변환
return resultList.stream().mapToInt(i -> i).toArray();
}
더 효율적이고 깔끔한 코드를 작성하기 위해, 중복을 줄이고 동적 배열을 활용하여 수험생의 수를 유연하게 처리하는 방법을 제안합니다. 아래 코드는 ArrayList
를 사용하여 동점인 경우를 쉽게 처리하고, 결과 반환 부분을 간소화했습니다.
정답 카운트 배열: counts
배열을 사용하여 각 수험생의 맞춘 문제 수를 저장합니다. 이는 코드의 가독성을 높이고, 반복적인 변수를 줄입니다.
최대 점수 찾기: Math.max
를 사용하여 최대 점수를 쉽게 찾습니다. 이로 인해 복잡한 조건문을 줄일 수 있습니다.
동적 결과 저장: ArrayList
를 사용하여 동점인 수험생의 번호를 저장합니다. 이 방식은 수험생 수에 관계없이 유연하게 동작합니다.
결과 변환: 최종 결과를 ArrayList
에서 배열로 변환하여 반환합니다. 이 과정은 Java 8의 스트림 기능을 사용하여 간결하게 처리됩니다.