반응형

이번 문제는 <모의고사>다.
"코딩 테스트 합격자 되기 자바편" 기준으로는 4번에 해당
(문제 출처 : 프로그래머스 https://school.programmers.co.kr/learn/courses/30/lessons/42840)

프로그래머스는 블로그 게재시 문제 여지가 있어
자세한 내용 없이 문제 제목과 링크로 대체합니다. 

문제 설명부터 너무 나를 위한 거라 마음에 들더라?
(아무도 안 믿지만 과거의 수포자)

패턴이 정확히 있고 하니까
정답 배열이랑 비교해서 맞은 개수 카운트 하면 되겠네
하고 가볍게 시작했는데
나중에 보니 가장 많은 문제를 맞힌 사람을 숫자로 표현해줘야 했다.
그게 좀 까다롭(?)다.

import java.util.*;

class Solution {
    public int[] solution(int[] answers) {
        int[] answer = {};
        
        int[] sa1 = {1, 2, 3, 4, 5}; // 5개
        int[] sa2 = {2, 1, 2, 3, 2, 4, 2, 5}; // 8개
        int[] sa3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}; // 10개
        int[] score = new int[3]; // 점수 계산용
        ArrayList<Integer> ans = new ArrayList<>();
    
        int s1 = 0, s2 = 0, s3 = 0;
        
        for (int i=0; i<answers.length; i++){
        	// 1번 학생의 패턴인 1~5 순서대로 반복하면서 비교
            if(sa1[s1]==answers[i]) {score[0]++;}
            s1++;
            if(s1==5) {s1=0;}
            
             if(sa2[s2]==answers[i]) {score[1]++;}
            s2++;
            if(s2==8) {s2=0;}
            
             if(sa3[s3]==answers[i]) {score[2]++;}
            s3++;
            if(s3==10) {s3=0;}
        }
        
        // 가장 많이 맞춘 학생의 점수 찾기
        int max = Arrays.stream(score)
                        .max().getAsInt();
        
        // 최고점과 각 학생의 점수 비교해서, 순서찾기
        // 다 같이 점수가 동일한 경우에는 어차피 1번 학생부터 add됨
        for (int i=0; i<3; i++){
            if (max == score[i]){
                ans.add(i+1);
            }
        }
        answer = ans.stream().mapToInt(Integer::intValue).toArray();
        return answer;
    }
}

오 책의 예시 답안을 보니 접근방법은 나랑 비슷한데, 훨씬 더 깔끔하게 풀어내셨다.

import java.util.*;

class Solution {
    public int[] solution(int[] answers) {
        int[] answer = {};
        
        // (나랑 다른 부분) 패턴을 이렇게 2차원 배열에 넣었다.
        
        int [][] pattern ={
        	{1, 2, 3, 4, 5}, // 5개
            {2, 1, 2, 3, 2, 4, 2, 5}, // 8개
			{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}; // 10개
            }
            
        // (동일) 점수 저장할 배열을 만들었다    
        int[] score = new int[3]; // 점수용
        
        // 각 수포자의 패턴과 정답이 얼마나 일치하는지를
        // for문 2개에 구성해서 표현했다.
        // 이게 핵심이니까 여기는 필요하면 책을 찾아보세요.
        
        // (동일) 가장 높은 점수를 찾고
        int max = Arrays.stream(score)
                        .max().getAsInt();
                        
        // (동일) 가장 높은 점수를 가진 사람들을 찾아서 리스트에 담는다.
        for (int i=0; i<3; i++){
            if (max == score[i]){
                ans.add(i+1);
            }
        }
        answer = ans.stream().mapToInt(Integer::intValue).toArray();
        return answer;
    }
}

공부에 참고한 책 이름은 김희성 님의 "코딩 테스트 합격자 되기 자바편"입니다.

오늘의 챌린지 문제 2개를 풀면서 내가 느낀 것은

1. 어레이 리스트 할당하는 법과 >>  ArrayList<Integer> sums = new ArrayList<>();
2. 스트림 메서드를 활용하고 >> Arrays.stream(score).max().getAsInt();
3. 또 변환하는 법도 알아야 한다는 사실 >> sums.stream().mapToInt(Integer::intValue).toArray();

프로그래머스 레벨 1~3이랑 백준 실버까지는 풀어야 된다는데
할 수 있지 나 자신?! 

반응형

+ Recent posts