🥹

아좌잣 홧팅이닷!

토독토독..💻

알고리즘🤮/프로그래머스

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

SU_VIN 2022. 12. 14. 13:59
반응형

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

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번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한 조건

  • 시험은 최대 10,000 문제로 구성되어있습니다.
  • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

입출력 예

answers                                                                                                         return
[1,2,3,4,5] [1]
[1,3,2,4,2] [1,2,3]

생각해야 했던 점은 수포자들이 찍을 배열과 문제 정답이 들은 배열 answer의 길이를 맞춰야 한다는 점과

마지막 배열을 리턴할 때 크기를 정할 수 없으니 이걸 처리할 방식 정도? 였다!

 

처음에는 각 수포자들의 배열의 최소공배수를 구하여 그만큼씩 반복을 한 다음 문제 정답 배열 길이만큼 자르는 것이었다!

어라? 근데 이거 너무 낭비가 심하다고 생각이 들었다!

그래서 생각해낸 건 나머지 계산방법!

 

i가 0부터 시작할 때 이것을 각자의 수포자 배열의 길이로 나머지 계산을 해주면 된다! 이것을 정답 배열의 값과 비교해

각각의 위치의 score배열을 증가시켜주고 score 배열에서 Math.max로 최댓값을 구해준다

 

그 후 정답을 담을 배열을 처리해야 한다 하지만 가장 많은 문제를 맞힌 사람의 크기는 가변적이기 때문에

배열이 아니라 list로 처리해준 다음 다시 배열로 바꿔 리턴하면 끗!!!


문제풀이 

import java.util.ArrayList;
import java.util.List;

public class PRO_CT_1 {
    public static int[] solution(int[] answers) {
        int[] a ={1,2,3,4,5};
        int[] b= {2,1,2,3,2,4,2,5};
        int[] c= {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]==a[i%a.length]) score[0]++;
            if(answers[i]==b[i%b.length]) score[1]++;
            if(answers[i]==c[i%c.length]) score[2]++;

        }

        int max = Math.max(score[0],Math.max(score[1],score[2]));//3개의 값중 최대 구하기

        List<Integer> result = new ArrayList<>();
        for(int i=0;i<score.length;i++){
            if(score[i]==max){ //스코어의 값이 최대값과 같다면
                result.add(i+1); //리스트에 추가! ( 인덱스가 0부터 시작하기때문에 1을 더해줌)
            }
        }

        int[] arr= new int[result.size()]; //배열로 리턴해야하기에 다시 리스트 -> 배열
        for(int i=0;i<arr.length;i++){
            arr[i]=result.get(i);
        }

        return arr;

    }
    public static void main(String[] args) {
        int[] answer = {1,3,2,4,2};
        System.out.println(solution(answer));

    }
}

통과!

 

 

반응형