
| 문제 | 레벨 | 정답률 |
|---|---|---|
| 모의고사 | Lv.1 | 63% |
사실 이 문제는 이미 한 번 풀었던 적이 있었다.
이전 풀이 ➡️
근데 코드 보면 알겠지만 어처구니 없는 코드임,,ㅋ
피곤했는지 뭔 if문을 남발해놔서 다시 풀어봤숩니당

import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int[] st1 = {1,2,3,4,5};
int[] st2 = {2,1,2,3,2,4,2,5};
int[] st3 = {3,3,1,1,2,2,4,4,5,5};
int[] rank = new int[3];
for(int i = 0; i<answers.length; i++){
if(answers[i] == st1[i%5]){
rank[0]++;
}
if(answers[i] == st2[i%8]){
rank[1]++;
}
if(answers[i] == st3[i%10]){
rank[2]++;
}
}
int max = rank[0];
for(int i = 1; i<3; i++){
if(rank[i]>max){
max = rank[i];
}
}
int[] result = new int[3];
int p = 0;
for(int i = 0; i<3; i++){
if(rank[i] == max){
result[p++] = i+1;
}
}
return Arrays.copyOf(result, p);
}
}
import java.util.Arrays;
class Solution {
public int[] solution(int[] answers) {
int[] st1 = {1, 2, 3, 4, 5};
int[] st2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] st3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int[] rank = new int[3];
for (int i = 0; i < answers.length; i++) {
if (answers[i] == st1[i % st1.length]) rank[0]++;
if (answers[i] == st2[i % st2.length]) rank[1]++;
if (answers[i] == st3[i % st3.length]) rank[2]++;
}
int max = Arrays.stream(rank).max().getAsInt();
return Arrays.stream(new int[]{1, 2, 3})
.filter(i -> rank[i - 1] == max)
.toArray();
}
}
크게 달라진 부분은 마지막에 max 값찾고 return 하는 부분밖에 없다.
그리고 배열 길이를 지정하는 대신 length로 얻어온 점?
Arrays.stream(rank).max().getAsInt()
stream 메서드는 배열을 스트림으로 변환
max 메서드로 스트림의 최댓값을 계산하고, getAsInt() 메서드로 값을 꺼냄
Arrays.stream(new int[]{1,2,3}).filter(i -> rank[i-1] == max).toArray()
마찬가지로 배열을 스트림으로 변환, 1,2,3 요소를 갖는 새로운 배열을 생성
filter() 메소드로 스트림의 각 요소에 대해 주어진 조건을 검사 -> 조건 만족 요소만 포함해서 새로운 스트림 생성
toArray() 메소드로 다시 배열로 반환한다.
stream으로 최적화 코드를 만들어봤는데, 아직 스트림을 제대로 사용해보지 않아서 그런지 코드를 읽는 것만으로도 어색하다.
최근에 코테 문제를 거의 안풀어서 감을 좀 잃은 것 같아서,, 다시 매일 풀도록 노력해야겠다. 감을 다시 돌려오자 . . .