[문제]
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.
[Algorithm]
1. 수포자 3명의 찍기 패턴을 배열에 각각 담기
2. answers 배열을 돌면서 각 수포자가 맞춘 문제의 개수 카운트 → scores[] 배열에 추가
3. scores 배열에서 가장 큰 수 찾기 → maxscore에 할당
4. scores 배열에서 maxscore에 해당하느 ㄴ인덱스를 찾아서 +1 하고 return
→ 인덱스 + 1이 해당 수포자임
[Code]
import java.util.*;
class Solution{
public int[] solution(int[] answers) {
// 각 수포자의 찍기 패턴
int[] person1 = {1, 2, 3, 4, 5};
int[] person2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] person3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int[] scores = new int[3];
// 정답과 비교하여 점수 계산
for (int i = 0; i < answers.length; i++) {
if (answers[i] == person1[i % person1.length]) scores[0]++;
if (answers[i] == person2[i % person2.length]) scores[1]++;
if (answers[i] == person3[i % person3.length]) scores[2]++;
}
// 최고 점수 찾기
int maxScore = Arrays.stream(scores).max().getAsInt();
// 최고 점수를 받은 사람(들) 찾기
List<Integer> result = new ArrayList<>();
for (int i = 0; i < 3; i++) {
if (scores[i] == maxScore) {
result.add(i + 1); // 1번, 2번, 3번 수포자
}
}
return result.stream().mapToInt(i -> i).toArray();
}
}
[+ 다른 사람 풀이]
import java.util.*;
class Solution {
public static int[] solution(int[] answers) {
int[][] patterns = {
{1, 2, 3, 4, 5},
{2, 1, 2, 3, 2, 4, 2, 5},
{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
};
int[] hit = new int[3];
for(int i = 0; i < hit.length; i++) {
for(int j = 0; j < answers.length; j++) {
if(patterns[i][j % patterns[i].length] == answers[j]) hit[i]++;
}
}
int max = Math.max(hit[0], Math.max(hit[1], hit[2]));
List<Integer> list = new ArrayList<>();
for(int i = 0; i < hit.length; i++)
if(max == hit[i]) list.add(i + 1);
int[] answer = new int[list.size()];
int cnt = 0;
for(int num : list)
answer[cnt++] = num;
return answer;
}
}
수포자의 정답 패턴을 2차원 배열로 넣어서 정답 배열과 비교하는 반복문의 코드를 더 깔끔하게 작성한 코드
마지막 return 부분에 stream을 사용하지 않고 for문을 사용해 성능을 향상시킴
stream을 활용한 코드에 대해 성능상 문제 제기를 하는 댓글들이 많았다,,
stream과 for문의 사용과 성능에 대해 잘 정리해둔 velog가 있어 첨부
👀[JAVA] For과 Stream은 어떤 차이가 있는걸까?
코테를 풀때 나는 보통 원시 For문을 활용해서 반복문을 처리하는 경우가 많았다! 이유는... 스트림에 대해서 잘 몰랐기 때문! 그런데 다른 사람의 풀이를 살펴보다보면 stream이라는 api를 통해 아
velog.io
결론적으로 for문이 성능상으로 거의 무조건 나은데 그 차이가 미미한 경우도 많다고 한다
실무에서 가독성과 유지보수 등의 이유로 stream을 사용하는 것이 나을 때도 있어서 상황에 따라 잘 판단해서 사용하면 됨
'Algorithm Study' 카테고리의 다른 글
[Java Algorithm] 프로그래머스 Lv.2_ 카펫 (4) | 2025.08.04 |
---|---|
[Java Algorithm] 프로그래머스 Lv.2_ 소수 찾기 (2) | 2025.07.31 |
[Java Algorithm] 프로그래머스 Lv.1 _ 최소직사각형 (2) | 2025.07.30 |
[Java Algorithm] 프로그래머스 Lv.2 _ H-Index (2) | 2025.07.30 |
[Java Algorithm] 프로그래머스 Lv.2 _ 가장 큰 수 (4) | 2025.07.30 |