프로그래머스 - 모의고사(완전탐색) [java/python]

Stella·2021년 12월 3일
0

Coding Test

목록 보기
8/48

문제링크: https://programmers.co.kr/learn/courses/30/lessons/42840

모의고사

문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.

입출력 예

answerreturn
[1,2,3,4,5][1]
[1,3,2,4,2][1,2,3]

Soulution 1 (Java)

public int[] solution(int[] answers) {
	        int[] score = {0, 0, 0}; // 수포자들이 정답을 맞춘 개수
	        int[] person1 = {1, 2, 3, 4, 5}; // 수포자1의 패턴
	        int[] person2 = {2, 1, 2, 3, 2, 4, 2, 5}; // 수포자2의 패턴
	        int[] person3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}; 수포자3의 패턴
	        
            //맞춘 개수 만큼 score에 count
	        for(int i=0; i<answers.length; i++){
            // 수포자들의 패턴 개수를 이용해서 나머지를 구하면, 배열의 자리값이 된다.
	        if(person1[i%5] == answers[i]) 
	            score[0]++;
	        if(person2[i%8] == answers[i])
	            score[1]++;
	        if(person3[i%10] == answers[i])
	            score[2]++;
	        }
	        ArrayList<Integer> list = new ArrayList<>();
            //가장 많이 정답을 맞춘 사람 찾아서 list에 추가
	        int high = Math.max(Math.max(score[0],score[1]),score[2]);
	           if(high == score[0])
	            	list.add(1);
	           if(high == score[1])
	            	list.add(2);
	           if(high == score[2])
	            	list.add(3);
	        
	        int[] answer = new int[list.size()];
	        for(int i=0; i<answer.length; i++) {
	        	answer[i] = list.get(i);
	        }
	        return answer;
	    }

수포자들이 문제를 찍는 방법의 패턴을 찾아서 array에 넣어준다. 그 패턴대로 각 수포자들이 맞춘 개수를 score에 넣는다. 수포자들의 패턴 개수로 i를 나눈 나머지를 구하면, 수포자들의 패턴의 배열 자리값을 구할 수 있다. 예를 들어, 1번 수포자의 패턴은 5 이므로, 0%5=0, 1%5=1, 2%5=2,3%5=3,4%5=4 이런 식으로 자리 값을 얻을 수 있다. 가장 많이 맞춘 수포자를 list에 넣어준 후, list를 array에 담아서 반환한다.

Solution 2 (Java)

public int[] solution(int[] answers) {
	int[] score = {0, 0, 0}; 
        int[] person1 = {1, 2, 3, 4, 5};
        int[] person2 = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] person3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
        
        for(int i=0; i< answers.length; i++){
            if(person1[i%5] == answers[i])
                score[0]++;
            if(person2[i%8] == answers[i])
                score[1]++;
            if(person3[i%10] == answers[i])
                score[2]++;
        }     
//        int[] arr = new int[score.length];
//        for(int i=0; i<score.length; i++){
//            arr[i] = score[i];
//        }
        int[] arr = Arrays.copyOfRange(score, 0, score.length);
        Arrays.sort(arr);
        ArrayList<Integer> list = new ArrayList<>();
        for(int i=0; i<arr.length; i++){
            if(score[i] == arr[2]){
                list.add(i+1);
            }
        }
        int[] answer = new int[list.size()];
        for(int i=0; i<list.size(); i++){
            answer[i] = list.get(i);   
        }
        return answer;
    }

두번째 방법은 score array를 arr array로 복사한 후, arr를 오름차순으로 정렬하여, score에 들어있는 값이 arr에서 가장 큰 값과 일치하면 i+1을 list에 넣는다.

Solution (Python)

def solution(answers):
    answer = []
    f = [1,2,3,4,5]
    s = [2,1,2,3,2,4,2,5]
    t = [3,3,1,1,2,2,4,4,5,5]
    score = [0,0,0]
    
    for i in range(len(answers)): 
        if answers[i] == f[i%5]:
            score[0] += 1
        if answers[i] == s[i%8]:
            score[1] += 1
        if answers[i] == t[i%10]:
            score[2] += 1

    for idx, s in enumerate(score):
        if s == max(score):
            answer.append(idx+1)
    print(answer)
    return answer

자바보다 짧게 해결가능.

profile
Hello!

0개의 댓글