⏱소요 시간 - 1시간 40분
🔑해결 방법
하... 이 문제는 정말 힘들었다.
수식을 찾는 것 까지는 괜찮았는데 배열을 통해서 가장 많이 맞힌 사람을 저장하려고 하니, 동일 점수가 있을수록 뭔가 꼬였다.
왜냐? 배열의 길이는 한 번 정해지면 유동적으로 바꿀 수 없기 때문이다......ㅠ
그러므로 앞으로 유동적인 무언가를 저장할 때는 리스트를 사용하자. 절대 잊지말자!!!
또 한 가지, a, b, c 배열이 answers 배열의 길이보다 작은 경우를 생각해줘야하는데 (a, b, c를 몇 바퀴씩 돌아야할 경우)
아래의 코드를 예로, a의 길이는 5, answers 길이는 10이라고 가정하자.
a[0] == answers[0]
a[1] == answers[1]
...
a[5] == answers[5] // a에는 인덱스 5가 없잖아! 그럼 0부터 다시 시작할 수 있도록 수식을 생각해보자.
a[5%a.length] = a[5%5] = 0 = a[0]는
결국 a[0] == answers[5] 가 되므로 반복~
a[6] == answers[6] ---> a[6%a.length] --> a[6%5] = 1
a[7] == answers[7] ---> a[7%a.length] --> a[7%5] = 2
이런식이 된다!
🔎소스 코드
package step1;
import java.util.*;
// 모의고사
public class Ex04 {
public static void main(String[] args) {
System.out.println(solution(new int[]{ 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 }));
System.out.println(solution(new int[]{ 1, 3, 2, 4, 2 }));
System.out.println(solution(new int[]{ 5, 4, 3, 2, 1 }));
}
public static int[] solution(int[] answers) {
int[] answer = {}; // 가장 많이 맞힌 사람이 저장될 배열
int[] cnt = new int[3]; // cnt[0]: a가 맞힌 개수, cnt[1]: b가 맞힌 개수, cnt[2]: c가 맞힌 개수
int[] a = { 1, 2, 3, 4, 5 };
int[] b = { 2, 1, 2, 3, 2, 4, 2, 5 };
int[] c = { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 };
for(int i = 0; i < answers.length; i++) {
if(a[i%5] == answers[i]) {
cnt[0]++;
}
if(b[i%8] == answers[i]) {
cnt[1]++;
}
if(c[i%10] == answers[i]) {
cnt[2]++;
}
}
// cnt 배열에서 가장 큰 수 가져오기 (동일한 경우가 있을 수 있으니 리스트에 담아서 내보내자)
List<Integer> list = new ArrayList<Integer>();
int max = Math.max(cnt[0], Math.max(cnt[1], cnt[2]));
if(max == cnt[0]) {
list.add(1);
}
if(max == cnt[1]) {
list.add(2);
}
if(max == cnt[2]) {
list.add(3);
}
answer = list.stream().mapToInt(i->i).toArray();
System.out.println(Arrays.toString(answer));
return answer;
}
}
'ALGORITHM' 카테고리의 다른 글
[프로그래머스 Java] K번째 수 (0) | 2021.01.09 |
---|---|
[프로그래머스 Java] 체육복 (0) | 2021.01.09 |
[프로그래머스 Java] 완주하지 못한 선수 (0) | 2021.01.08 |
[프로그래머스 Java] 두 개 뽑아서 더하기 (0) | 2021.01.08 |
List <-> int[] (0) | 2021.01.07 |