https://school.programmers.co.kr/learn/courses/30/lessons/42840
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
슈도코드
1. 문제 갯수만큼 돌면서 수포자 3명의 답을 채점한다.
2. 가장 높은 점수를 가진 수포자를 배열에 추가한다
3. 배열 return
구현
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int[] tmp = {0,0,0,0};
int[] p1 = {1,2,3,4,5};
int[] p2 = {2,1,2,3,2,4,2,5};
int[] p3 = {3,3,1,1,2,2,4,4,5,5};
ArrayList<Integer> list = new ArrayList<>();
for(int i=0; i<answers.length; i++){
if(answers[i]== (p1[i%p1.length])) tmp[1]++;
if(answers[i]== (p2[i%p2.length])) tmp[2]++;
if(answers[i]== (p3[i%p3.length])) tmp[3]++;
}
int max = tmp[1];
list.add(1);
for(int i =1; i<tmp.length-1; i++){
if(max<tmp[i+1]){
list.clear();
list.add(i+1);
max = tmp[i+1];
}else if(max==tmp[i+1]){
list.add(i+1);
}
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
해서 다음과 같은 코드를 작성하였다.
나는 최대값(가장 많은 문제를 맞춘 값)을 찾기 위해서, 첫 번째 값을 max로 두고서 하나씩 순차대로 찾아가면서 정답 배열에 추가하고자 하였다.
즉
if 내가 지금 확인하는 수포자 정답 갯수가 max의 값보다 크다면, 기존 정답배열에 있는 수포자들을 다 삭제하고 지금 확인하는 수포자를 추가한다. 그리고 max값 업데이트
else if 내가 지금 확인하는 수포자 정댑 갯수가 max의 값과 같다면, 기존 정답배열에 지금 확인하고 있는 수포자를 추가한다.
이런식으로 해서 ArrayList에 추가하고 최종적으로 반환을 해주었다.
Math를 사용한 풀이
교재와 다른 사람의 코드를 보니 여러부분이 다른 점이 존재 하였다.
먼저 나는 수포자 1,2,3를 p1, p2, p3 배열로 3개로 관리를 하였었다.
하지만 교재에서는 2차원 배열로 관리하도록 하였다.
int[][] pattern = {{1,2,3,4,5},{2,1,2,3,2,4,2,5}, {3,3,1,1,2,2,4,4,5,5}};
이런식으로 말이다.
그 다음 조금 다른 점은 최대값을 찾는 방법이다.
나는 위에서 설명한 것 처럼, 처음값을 max로 두고 for문을 돌면서 업데이트를 하였다.
교재에서는 Math를 사용하였다.
일단 tmp를 다 저장한 다음(채점을 다 한 뒤)를 보겠다.
tmp에는 총 3명의 수포자의 채점 결과가 저장 돼있을 것이다.
여기서 Math함수를 써서 가장 많이 맞춘 정답 개수를 찾아낸다(누가 많이 맞췄는지는 알 필요가 없음)
int maxScore = Math.max(score[0], Math.max(score[1], score[2]));
이런 식으로 말이다.
Stream을 사용하여 Max를 찾기
int maxScore = Arrays.stream(score).max().getAsInt();
이런식으로 primitive 타입의 배열의 steam을 생성한 뒤
max() 메서드를 이용하여 max값을 찾아낸다.
이때 주의할 점은, max() 메서드의 반환값이 OptionalInt 이기에
getAsInt()메서드를 사용하여 다시 int값으로 바꿔주어야 한다.
'코팅테스트' 카테고리의 다른 글
| [코딩 테스트] 근손실 (feat. 백트래킹) (1) | 2025.01.25 |
|---|---|
| [코딩 테스트] 체스판 다시 칠하기 (4) | 2025.01.24 |
| [코딩 테스트] 방문 길이 (3) | 2025.01.08 |
| [코딩 테스트] 실패율 (2) | 2025.01.08 |
| [코딩테스트] 두 개 뽑아서 더하기 (Feat. Stream과 IntStream에 관하여..) (6) | 2025.01.07 |