모의고사 | 프로그래머스

Bluewave·2024년 8월 5일

코테공부_java

목록 보기
43/99
post-thumbnail

문제

🍀 문제 바로가기

문제레벨정답률
모의고사Lv.163%

사실 이 문제는 이미 한 번 풀었던 적이 있었다.
이전 풀이 ➡️

근데 코드 보면 알겠지만 어처구니 없는 코드임,,ㅋ
피곤했는지 뭔 if문을 남발해놔서 다시 풀어봤숩니당

My Code

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);
    }
}
  1. 각 배열에 패턴 넣어서 초기화
  2. 점수를 저장할 rank 배열 선언
  3. for문 돌면서 각 rank 갱신
    • 패턴 길이와 answers 길이가 다를 수 있으므로 %연산을 사용
  4. rank 배열에서 max 값 찾기
  5. max 값과 같은 사람 찾아서 번호 result 배열에 추가
  6. result 배열을 max 값을 가진 사람 수대로 잘라서 return
    • Arrays.copyOf() 메소드 사용하면 n개만큼 배열 잘라올 수 있음

최적화 코드

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으로 최적화 코드를 만들어봤는데, 아직 스트림을 제대로 사용해보지 않아서 그런지 코드를 읽는 것만으로도 어색하다.
최근에 코테 문제를 거의 안풀어서 감을 좀 잃은 것 같아서,, 다시 매일 풀도록 노력해야겠다. 감을 다시 돌려오자 . . .

profile
Developer's Logbook

0개의 댓글