[문제]
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.
1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...
1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.
[내 풀이]
나는 이번에 결과 값을 구하는 과정에서 stream()을 활용했는데, 일부러 사용했다.
짧은 코드가 무조건 좋은 코드가 아닌 것은 안다.
하지만 간결한 코드를 작성할 수 있는 사람이 상황에 따라 원시적인 코드나 간결한 코드를 취사 선택하여 작성하는 것과 간결한 코드를 작성하지 못해서 원시적인 코드만을 작성하는 것은 천지차이라고 생각한다.
지금 나는 stream()의 사용법을 더 많이 익히고 활용해보고 싶기 때문에 앞으로도 굳이 이걸 stream()으로? 하는 코드들까지 작성할 생각이다.
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int[] answer = {};
int[] aAnswers = {1, 2, 3, 4, 5, 1, 2, 3, 4, 5};
int[] bAnswers = {2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5};
int[] cAnswers = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
Map<String, Integer> map = new HashMap<>();
List<Integer> list = new ArrayList<>();
// 성적 구하기
for (int i=0;i<answers.length;i++) {
int num = answers[i];
if (aAnswers[i%aAnswers.length]==num)
map.put("1", map.getOrDefault("1",0)+1);
if (bAnswers[i%bAnswers.length]==num)
map.put("2", map.getOrDefault("2",0)+1);
if (cAnswers[i%cAnswers.length]==num)
map.put("3", map.getOrDefault("3",0)+1);
}
// 최고 득점 추출
int maxValue = map.entrySet().stream()
.max(Map.Entry.comparingByValue())
.map(Map.Entry::getValue)
.get();
// 최고 득점자 list에 담기
map.forEach((key, value) -> {
if (value==maxValue)
list.add(Integer.valueOf(key));
});
// 최고 득점자 오름차순 정렬 및 Array 변환
answer = list.stream().sorted().mapToInt(Integer::intValue).toArray();
return answer;
}
}
<문제 출처>
programmers.co.kr/learn/courses/30/lessons/42840
'JAVA > Argorithm Test' 카테고리의 다른 글
# Level1 - 문자열 내 P와 Y의 개수 (0) | 2020.11.04 |
---|---|
# Level1 - 3진법 뒤집기 (0) | 2020.11.02 |
# Level1 - 예산 (0) | 2020.10.30 |
# Level1 - 두개 뽑아서 더하기 (0) | 2020.10.29 |
# Level1 - [1차] 비밀지도 (0) | 2020.10.28 |