프로그래머스 (완전탐색) - 모의고사
해당 문제에서는 수포자의 패턴을 확인하여 패턴 배열을 가진 Giver를 생성해 answers 전체를 돌면서 정답수를 counting 해주었고, 이후 정답수 기준의 우선순위 큐에 넣은 후 빼내면서 정답수가 동일할 경우 가장많은 문제를 맞힌 사람의 id를 저장하는 리스트에 넣었습니다. 앞의 동작을 완료 후 정렬하여 primitive type 배열로 변경하여 리턴해주었습니다. 큐에 순서대로 넣기 때문에 마지막에 정렬을 할 필요는 없어 보이기는 하지만 문제대로 여러명일 경우 오름차순 정렬 하라는 요구사항이 있기 때문에 명시적으로 넣어 주도록 하였습니다.
public int[] solution(int[] answers) {
List<Integer> firstRankerIds = new ArrayList<>();
Giver giver1 = new Giver(new int[]{1,2,3,4,5}, 1);
Giver giver2 = new Giver(new int[]{2,1,2,3,2,4,2,5}, 2);
Giver giver3 = new Giver(new int[]{3,3,1,1,2,2,4,4,5,5}, 3);
for (int i = 0; i < answers.length; i++) {
giver1.grade(i, answers[i]);
giver2.grade(i, answers[i]);
giver3.grade(i, answers[i]);
}
PriorityQueue<Giver> rankingQueue = new PriorityQueue<>(Comparator.comparingInt(Giver::getCorrectCount).reversed());
rankingQueue.add(giver1);
rankingQueue.add(giver2);
rankingQueue.add(giver3);
int maxCorrectCount = 0;
do {
Giver giver = rankingQueue.poll();
maxCorrectCount = giver.getCorrectCount();
firstRankerIds.add(giver.getId());
} while (!rankingQueue.isEmpty() && rankingQueue.peek().getCorrectCount() == maxCorrectCount);
firstRankerIds.sort(Integer::compareTo);
return firstRankerIds.stream().mapToInt(Integer::intValue).toArray();
}
private class Giver {
private final int[] pattern;
private final int id;
private int correctCount;
public Giver(int[] pattern, int id) {
this.pattern = pattern;
this.id = id;
}
int getId() {
return this.id;
}
void grade(int problemNumber, int answer) {
if (pattern[problemNumber % pattern.length] == answer) {
this.correctCount++;
}
}
int getCorrectCount() {
return correctCount;
}
}
'정리 > 알고리즘' 카테고리의 다른 글
완전탐색 - 카펫 (0) | 2022.02.21 |
---|---|
완전탐색 - 소수찾기 (0) | 2022.02.19 |
정렬 - H-Index (0) | 2022.02.16 |
정렬-가장 큰 수 (0) | 2022.02.15 |
정렬-K번째 수 (0) | 2022.02.14 |
댓글