본문 바로가기
항해

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

by neVerThe1ess 2024. 11. 16.

코딩테스트 연습 - 모의고사 | 프로그래머스 스쿨

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 


🌘문제 이해하기

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5,....

 

수포자들의 찍는 방식의 규칙은 

  • 1번 수포자는 1~5를 순서대로 찍는다.
  • 2번 수포자는 2, 1, 2, 3, 2, 4, 2, 5 순서대로 찍는다.
  • 3번 수포자는 3-1-2-4-5 순서로 두번씩 찍는다

수포자들의 찍는 방식을 각 배열에 저장하고 반복한다.

각 수포자들의 찍은 답과 anwers 배열의 답을 비교하여 점수를 매기고 점수의 최대값을 구한다.


🌗문제 자세히보기

 

정답 순서가 저장되어 있는 answer 과 수포자들의 찍는 방식을 비교하여 정답인 수포자에게 점수를 부여한다.

1.수포자들의 찍는 방식을 배열에 저장한다.

int[] first = new int[]{1, 2, 3, 4, 5}; //5개로 찍는 1번 수포자 
int[] second = new int[]{2, 1, 2, 3, 2, 4, 2, 5};//8개로 찍는 2번 수포자
int[] third = new int[]{3, 3, 1, 1, 2, 2, 4, 4, 5, 5};//10개로 찍는 3번 수포자

 

2.수포자들의 점수를 저장할 배열을 생성하고 answer 과 비교하며 점수를 부여한다. 

 

수포자들의 찍는 방식이 다 다른데 이를 규칙적이게 돌리기 위해 나머지(%) 를 사용한다.

예를 들어 9번제 문제면 아래 빨간색 숫자로 찍어야 한다. 

first     = 1, 2, 3, 4, 5, 1, 2, 3, 4

secod = 2, 1, 2, 3, 2, 4, 2, 5, 2

third    = 3, 3, 1, 1, 2, 2, 4, 4, 5

 

하지만 첫번째는 5개씩 찍고 , 두번째는 8번씩 , 세번재는 10번씩 찍는다.

위의 규칙들이 계속돌아가기 위해서는 나머지 방식을 사용하면 된다.

9%5 = 4 > int[] first = new int[]{1, 2, 3, 4, 5}; 
9%8 = 1 > int[] second = new int[]{2, 1, 2, 3, 2, 4, 2, 5};
9%10=9 > int[] third = new int[]{3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

 //수포자들의 각 점수
int[] score = {0,0,0};

for(int i=0;i<answers.length;i++)
{
    if(answers[i] == first[i%5]) score[0]++;
    if(answers[i] == second[i%8]) score[1]++;
    if(answers[i] == third[i%10]) score[2]++;
}

 

3. 가장 큰 점수를 가진 수포자를 구한다.

int maxScore = Math.max(score[0] , Math.max(score[1],score[2]));

 

4. 가장 큰 점수를 가진 수포자를 저장한다.(동일 점수면 동일한 수포자 모두)

 //점수가 높은 수포자만 따로 저장
List<Integer> supojaList = new ArrayList<>();
for(int i=0;i<score.length;i++)
{
    if(score[i] == maxScore)
    {                
        supojaList.add(i+1);
    }
}

 

5. list 에 담긴 수포자들은 answer 배열에 다시 저장


🌕 최종코드

import java.util.*;

public static int[] solution(int[] answers)
    {    
       int[] first = new int[]{1, 2, 3, 4, 5}; //5개로 찍는 1번 수포자 
       int[] second = new int[]{2, 1, 2, 3, 2, 4, 2, 5};//8개로 찍는 2번 수포자
       int[] third = new int[]{3, 3, 1, 1, 2, 2, 4, 4, 5, 5};//10개로 찍는 3번 수포자

       //수포자들의 각 점수
       int[] score = {0,0,0};

       for(int i=0;i<answers.length;i++)
       {
            if(answers[i] == first[i%5]) score[0]++;
            if(answers[i] == second[i%8]) score[1]++;
            if(answers[i] == third[i%10]) score[2]++;
       }

       //최대 점수 확인하기
       int maxScore = Math.max(score[0] , Math.max(score[1],score[2]));

       //점수가 높은 수포자만 따로 저장
       List<Integer> supojaList = new ArrayList<>();
       for(int i=0;i<score.length;i++)
       {
            if(score[i] == maxScore)
            {                
                supojaList.add(i+1);
            }
       }

       int[] answer = new int[supojaList.size()];

       for(int s=0; s<supojaList.size(); s++)
       {        
            answer[s] = supojaList.get(s);
       }
        
        return answer;
    }