3명의 음악 테스트 응시자들이 음계 맞추기 시험을 봅니다. 각 응시자들은 자신만의 패턴으로 답을 찍어서 문제를 풀기로 했습니다. 이번 시험에서 누가 가장 많은 문제를 맞혔는지 알아보려 합니다.
응시자 3명의 찍기 패턴
(1) 1번 응시자의 패턴: [도, 레, 미, 파]
* 4개의 음계를 순차적으로 반복
* ex) 도,레,미,파,도,레,미,파,도,레,...
(2) 2번 응시자의 패턴: [레, 레, 파, 파, 도, 도]
* 6개의 음계를 순차적으로 반복
* ex) 레,레,파,파,도,도,레,레,파,파,...
(3) 3번 응시자의 패턴: [미, 파, 미, 도, 레, 도]
* 6개의 음계를 순차적으로 반복
* ex) 미,파,미,도,레,도,미,파,미,도,...
시험문제의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지를 배열에 담아 return 하는 함수를 작성해주세요.
제한사항
입력 형식 및 예시
// 예시 1
6
도 레 미 파 도 레
// 예시 2
6
미 레 도 레 도 미
출력 형식
// 예시 1
1
// 예시 2
1 2
예시 상황 설명
각 응시의 점수를 계산해 가장 높은 점수의 사람을 반환하면 됩니다.
예시 1의 입력이 ["도", "레", "미", "파", "도", "레"]이므로 :
1번 응시자가 6점으로 가장 높은 점수를 갖게 됩니다. 따라서 1 을 출력합니다.
예시 2의 입력이 ["미", "레", "도", "레", "도", "미"]이므로 :
1번 응시자: 도❌ 레✅ 미❌ 파❌ 도✅ 레❌ (2점)
2번 응시자: 레❌ 레✅ 파❌ 파❌ 도✅ 도❌ (2점)
3번 응시자: 미✅ 파❌ 미❌ 도❌ 레❌ 도❌ (1점)
1번, 2번 응시자가 2점으로 가장 높은 점수이고 동점이므로 오름 차순으로 1 2로 출력해야 합니다.
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char solution;
System.out.print("문제 개수 입력: ");
int count = sc.nextInt();
// 문제 개수 입력
if(count < 1){
throw new IllegalArgumentException("개수가 너무 적습니다.");
} else if (count > 5000) {
throw new IllegalArgumentException("개수가 너무 많습니다.");
}// 전제조건: 1~5000개 사이
String[] solutions = new String[count];
for(int i = 0; i < solutions.length; i++){
solution = sc.next().charAt(0); // '도레' 같이 두 글자가 저장되는 것을 방지
if(solution != '도' && solution != '레' && solution != '미' && solution != '파'){
throw new IllegalArgumentException("문제에 주어지지 않은 음계입니다.");
}// 도,레,미,파 중 하나의 음계 사용
solutions[i] = String.valueOf(solution);
}
Tester.tester(solutions);
public class Tester {
public static void tester(String[] solutions){
String[] tester1 = {"도", "레", "미", "파"};
String[] tester2 = {"레", "레", "파", "파", "도", "도"};
String[] tester3 = {"미", "파", "미", "도", "레", "도"};
int[] testerScore = {0,0,0};
for(int i = 0; i < solutions.length; i++){
if(tester1[i % tester1.length].equals(solutions[i])){
testerScore[0] ++;
}
if(tester2[i % tester2.length].equals(solutions[i])){
testerScore[1] ++;
}
if(tester3[i % tester3.length].equals(solutions[i])){
testerScore[2] ++;
}
}// 비교해서 점수 추가
int max = Math.max(testerScore[0],testerScore[1]);
if(max < testerScore[2]) {
max = testerScore[2];
}// 최댓값 구하기
int finalMax = max;
IntStream.range(0, testerScore.length)
.filter(j -> testerScore[j] == finalMax)
.forEach(j -> System.out.print(j+1 + " "));
// 최댓값 위치 찾아서 출력
}
}