🔗 문제 링크
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📝 문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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 함수를 작성해주세요.
⚠️ 제한 사항
- 시험은 최대 10,000 문제로 구성되어있습니다.
- 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
- 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.
✨ 내 코드
import java.util.Arrays;
import java.util.ArrayList;
class Solution {
public int[] solution(int[] answers) {
// Pattern
int[] pattern1 = {1, 2, 3, 4, 5};
int[] pattern2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] pattern3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
// Check Answer
int[] score = {0, 0, 0};
for(int i = 0; i < answers.length; i++) {
if(answers[i] == pattern1[i % pattern1.length])
score[0] += 1;
if(answers[i] == pattern2[i % pattern2.length])
score[1] += 1;
if(answers[i] == pattern3[i % pattern3.length])
score[2] += 1;
}
// Get Max Score
int maxScore = Arrays.stream(score).max().getAsInt();
// Person Who Get Answer
ArrayList<Integer> answerList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
if(score[i] == maxScore)
answerList.add(i+1);
}
// ArrayList -> Array
int[] answer = answerList.stream().mapToInt(Integer::intValue).toArray();
return answer;
}
}
💡 풀이
- 수포자들의 찍기 패턴을 정리한다.
- 주어진 answers 배열을 for문으로 돌며 score에 각 수포자의 득점을 정리한다.
answers 배열이 수포자들의 패턴보다 길 수 있으니 나머지를 이용한다. - max()를 통해 최고득점을 찾는다.
- score를 for문으로 돌며 최고득점자들의 번호를 answerList에 담는다.
index는 0부터 시작하므로 index에 1을 더한다. - ArrayList를 Array로 바꾼다.
💭 회고
요즘 SQL을 자주 다뤄서 ArrayList에 바로 max() 했다가 안 먹혀서 당황했다.
max()도 Stream에 있는걸 보니 Stream에 대해 자세히 알아볼 필요가 있는 것 같다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
| [Java] Lv2. 표 편집 (0) | 2025.06.01 |
|---|---|
| [Java] Lv2. 방문 길이 (1) | 2025.05.25 |
| [Java] Lv2. 실패율 (0) | 2025.05.25 |
| [Java] Lv2. 행렬의 곱셈 (0) | 2025.05.25 |
| [Java] Lv1. 두 개 뽑아서 더하기 (0) | 2025.05.25 |