https://programmers.co.kr/learn/courses/30/lessons/42840#qna
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
public int[] solution(int[] answers) {
//수포자별로 배열을 만들기
//찍는 방식을 배열로 생성
int[] p1a = new int[]{1, 2, 3, 4, 5};
int[] p2a = new int[]{2, 1, 2, 3, 2, 4, 2, 5};
int[] p3a = new int[]{3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int[] p1 = new int[answers.length];
int[] p2 = new int[answers.length];
int[] p3 = new int[answers.length];
//%를 이용해서 answers 배열 수만큼 반복해서 배열 넣기
for (int i = 0; i < answers.length; i++) {
p1[i] = p1a[i%p1a.length];
p2[i] = p2a[i%p2a.length];
p3[i] = p3a[i%p3a.length];
}
//일치하는 횟수 카운트하기
int k1 = 0, k2 = 0, k3 = 0;
for (int i = 0; i < answers.length; i++) {
if(p1[i] == (answers[i])) k1++;
if(p2[i] == (answers[i])) k2++;
if(p3[i] == (answers[i])) k3++;
}
//배열 위치 확인 위해 원래 배열 유지
int[] groups = new int[]{k1, k2, k3};
//복사본 배열 통해 최대값 확인
int[] groupsSort = groups.clone();
Arrays.sort(groupsSort);
int max = groupsSort[2];
//최대값보다 같거나 크면 group에 넣기
//1, 2, 3번 순으로 확인해서 별도로 오름차순 안해도 됨.
List<Integer> arr = new ArrayList<>();
for (int i = 0; i < groups.length; i++) {
if (groups[i] >= max) {
arr.add(i+1);
}
}
//답안제출을 위해 int[]로 변환
//int[] answer = arr.stream().mapToInt(Integer::intValue).toArray();
int[] answer = new int[arr.size()];
int k = 0;
for (int x : arr) {
answer[k++] = x;
}
return answer;
}
}
이 문제는 문제를 어떻게 풀지 틀은 금방 잡았는데, 각각을 구현하는게 쉽지 않았다.
1. 순서가 반복되는 배열 만들기
- 수포자의 찍는 방식이 반복되는데 이걸 문제수(답안수)만큼 반복해야 했다.
- 배열을 따로 만들고 %을 이용해서 반복하였다.
2. 가장 많이 맞춘 사람을 배열로 출력하기
- 맞춘 횟수를 1, 2, 3번 수포자 순서대로 입력하는 배열을 만들었다 : int[] groups
- 복사본 배열을 만들어 최대값을 구했다.
- groups의 값을 최대값과 비교하여 같거나 크면 새로운 배열에 i+1을 입력하였다.
- 1, 2, 3번 학생 순으로 비교했기 때문에 별도로 오름차순을 하지 않아도 된다.
마지막에 List를 stream을 써서 int[]로 변환했는데 테스트당 2~4초 정도 걸렸다.
그런데 for문으로 변환하면 1초 전후로 가능하다.
가급적이면 for문을 쓰는게 더 빠르다.
Math.max를 쓰면 2개만 비교할 수 있는데 다음과 같이 겹쳐서 쓰면 3개도 비교할 수 있다.
int maxScore = Math.max(score[0], Math.max(score[1], score[2]));
'Language > JAVA' 카테고리의 다른 글
#JVM(Java Virtual Machine) (0) | 2022.01.24 |
---|---|
[프로그래머스] 소수 찾기 (0) | 2022.01.21 |
[프로그래머스] 로또의 최고 순위와 최저 순위 (0) | 2022.01.20 |
[프로그래머스] 두 개 뽑아서 더하기 (0) | 2022.01.20 |
[프로그래머스] 같은 숫자는 싫어 (0) | 2022.01.20 |