programmers.co.kr/learn/courses/30/lessons/42840
문제 요약
모의고사 정답 배열 answers를 받는다. 세 명의 학생이 각각 특정한 루프로 정답을 찍는다.
- 1번 학생: [1, 2, 3, 4, 5] 반복
- 2번 학생: [2, 1, 2, 3, 2, 4, 2, 5] 반복
- 3번 학생: [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] 반복
각 학생 중 최고 점수를 받은 학생들의 번호 배열을 반환한다.
문제 풀이
자바8의 streamAPI를 공부했었지만 아직 딱히 사용할 곳이 없어서 점점 잊어버리게 되는 걸 느끼고 앞으로는 최대한 자바8 문법을 사용해서 문제를 풀기로 하였다.
이 문제는 완전탐색 문제이고 조금 귀찮은 것을 빼고는 난이도는 매우 낮은 문제이다. 일단 각 학생의 반복 패턴 리스트를 배열로 만든다. 그 다음 인자로 받은 answers 배열과 비교하며 학생의 점수 배열을 채운다. 채점할 때는 루프[(문제의 번호) % (루프의 길이)]를 정답과 비교하면 된다.
그 후 학생 점수 배열에서 최대값을 찾고, 최대값과 같은 점수의 학생들의 번호를 배열로 만들면 되는데, 외부 반복으로 처리할 시 '배열에서 최대값 찾기', '배열에서 최대값과 같은 학생 수 찾기', '배열에 학생번호 채우기' 총 3번 for 문을 돌려야 하는데, 스트림을 사용하여서 처리하였기 때문에 선언형으로 모두 한번에 처리할 수가 있었다.
나의 코드
import java.util.*;
import java.util.stream.IntStream;
class 모의고사 {
public int[] solution(int[] answers) {
int[] students = new int[3]; // 학생들의 점수 배열
/* 학생별 반복 구간 List 배열 */
List<Integer>[] roop = new List[3]; // 반복 구간 배열 선언
for (int i = 0; i < 3; ++i)
roop[i] = new ArrayList<>();
roop[0] = Arrays.asList(1, 2, 3, 4, 5);
roop[1] = Arrays.asList(2, 1, 2, 3, 2, 4, 2, 5);
roop[2] = Arrays.asList(3, 3, 1, 1, 2, 2, 4, 4, 5, 5);
/* 채점하기 */
for (int i = 0; i < answers.length; ++i) {
for (int j = 0; j < 3; ++j) {
if (answers[i] == roop[j].get(i % roop[j].size()))
students[j]++;
}
}
/* 최대 점수와 같은 점수의 학생 번호 배열 반환 */
return IntStream.range(1, 4)
.filter(i -> students[i - 1] == Arrays.stream(students).max().getAsInt())
.toArray();
}
}
'Algorithme > Programmers' 카테고리의 다른 글
[프로그래머스] 가장 먼 노드 Java (0) | 2020.10.21 |
---|---|
[프로그래머스] 소수 찾기 Java (0) | 2020.10.18 |
[프로그래머스] 여행경로 Java (0) | 2020.10.16 |
[프로그래머스] 단어 변환 Java (0) | 2020.10.14 |
[프로그래머스] 네트워크 Java (0) | 2020.10.13 |