코딩테스트

[ 프로그래머스 ] 모의고사

Adose 2024. 10. 23. 22:25

📌 요구 사항 정리

  • 수포자 3명마다 찍는 방식이 존재 (수포자 3명)
  • 배열 answer이 주어질때, 가장 많은 문제를 맞힌 사람이 누구인지를 배열로 반환해야함
    • 함수의 이름은 solution()
  • 가장 높은 점수를 받은 사람(수포자)들이 여럿(중복)이 발생하면, 반환하는 값(수포자 들)을 오름차순으로 정렬

 

📌 제약 조건

  • 시험은 최대 10,000문제
  • 문제의 정답은 1, 2, 3, 4, 5 중 하나이다.

 

📌 문제 분석

  • 수포자들의 패턴을 파악해야 한다.
    • 수포자 1 : 1, 2, 3, 4, 5 반복
    • 수포자 2 : 2, 1, 2, 3, 2, 4, 2, 5 반복
    • 수포자 3 : 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 반복
  • answer이 주어졌을때, 수포자의 값과 answer를 비교해서 값이 같으면 정답 배열에 +1 이런식으로 저장
  • 나중에 배열을 비교해서 return하면 되지 않을까 ?
  • 🌟 추가 ++
    • answer의 길이가 수포자의 패턴보다 길때, 수포자의 패턴의 처음 데이터와 비교할 수 있도록 해야 한다
두가지 방법으로 제출 완료 

 

1️⃣ [ 첫번째 제출 ] - 실패

  • 아래와 같은 코드를 입력했을때 실패했다.
  • 무수한 런타임에러 ,,, 뭐지 ?

import java.util.*;

class Solution {
    private static final int [] gvMath1 = {1, 2, 3, 4, 5};
    private static final int [] gvMath2 = {2, 1, 2, 3, 2, 4, 2, 5};
    private static final int [] gvMath3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

    
    public int[] solution(int[] arr) {
        int[] person = new int[4];

            for (int i = 0; i < arr.length; i++) {
                if (arr[i] == gvMath1[i]) {
                    person[1]++;
                }
                if (arr[i] == gvMath2[i]) {
                    person[2]++;
                }
                if (arr[i] == gvMath3[i]) {
                    person[3]++;
                }
            }

            //제일 큰 값을 찾는다.
            int max = Arrays.stream(person).max().getAsInt();

            //return을 위한 List 생성
            ArrayList<Integer> resultArr = new ArrayList<>();

            for (int i = 1; i < person.length; i++) {
                //제일 큰값과 수포자 정답 개수가 같으면 return값에 저장한다.
                if (person[i] == max) {
                    resultArr.add(i);
                }
            }

            return resultArr.stream().sorted().mapToInt(Integer::intValue).toArray();

        }
    }

 

 

1️⃣ [ 첫번째 제출 ] - 해결

  • 해결 방법
    • 위의 문제 풀이가 맞는데 왜 안될까 라는 생각에 시간 복잡도 문제인가 ? 생각했는데
    • answer이 수포자들의 길이보다 더 클때, 처음부터 다시 돌아와서 값을 다시 비교하도록 해야 하는데 그걸 안했다…ㅠㅠㅠ
  • 해결한 코드는 아래와 같다.
import java.util.*;

class Solution {
    private static final int [] gvMath1 = {1, 2, 3, 4, 5};
    private static final int [] gvMath2 = {2, 1, 2, 3, 2, 4, 2, 5};
    private static final int [] gvMath3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

    
    public int[] solution(int[] arr) {
        int[] person = new int[4];

            for (int i = 0; i < arr.length; i++) {
              if (arr[i]==gvMath1[i%gvMath1.length]) {
                person[1]++;
                }
            if (arr[i]==gvMath2[i%gvMath2.length]) {
                person[2]++;
                }
            if (arr[i]==gvMath3[i%gvMath3.length]) {
                person[3]++;
                }
            }
        
            //제일 큰 값을 찾는다.
            int max = Arrays.stream(person).max().getAsInt();

            //return을 위한 List 생성
            ArrayList<Integer> resultArr = new ArrayList<>();

            for (int i = 1; i < person.length; i++) {
                //제일 큰값과 수포자 정답 개수가 같으면 return값에 저장한다.
                if (person[i] == max) {
                    resultArr.add(i);
                }
            }

            return resultArr.stream().sorted().mapToInt(Integer::intValue).toArray();

        }
    }

 

2️⃣ [두번째 제출] - 해결

  • 2차원 배열을 사용하여 계산을 했다.
  • 첫번째 제출할때 무슨 문제인지 모르겠어서 두번째 제출 방법으로 풀다가 첫번째 코드의 문제점을 발견했다.
  • answer의 값이 수포자의 패턴보다 길때, 처음 데이터로 돌아가서 다시 계산하는 부분을 넘겼다는것을 알게 되었다.
  • 코드는 아래와 같다.
import java.util.*;

class Solution {
    public int[] solution(int[] answer) {
         int [][] gvMath ={
                    {1, 2, 3, 4, 5},
                    {2, 1, 2, 3, 2, 4, 2, 5},
                    {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
            };
            int[] person = new int[4];

            for(int i=0;i< answer.length;i++){
                for(int j=0;j<gvMath.length;j++){
                    if(answer[i] == gvMath[j][ i % gvMath[j].length]){
                        person[j+1]++;
                    };
                }
            }

            //제일 큰 값을 찾는다.
            int max = Arrays.stream(person).max().getAsInt();

            //return을 위한 List 생성
            ArrayList<Integer> resultArr = new ArrayList<>();

            for (int i = 1; i < person.length; i++) {
                //제일 큰값과 수포자 정답 개수가 같으면 return값에 저장한다.
                if (person[i] == max) {
                    resultArr.add(i);
                }
            }

            return resultArr.stream().sorted().mapToInt(Integer::intValue).toArray();

        }
}