본문 바로가기

Coding Test/Programmers

[JAVA] 완전탐색 Lv.1 / 모의고사

 

[문제]

 

https://programmers.co.kr/learn/courses/30/lessons/42840

[제한 조건]

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

[입출력 예]

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

[알고리즘]

문제의 정답과 수포자들이 제출한 답을 모두 비교하여 정답일시 포인트를 증가해주는 완전탐색 문제이다.
수포자들의 점수찍는 규칙을 통해 점수를 메기고 그 중 가장 큰 점수를 맞춘 사람의 번호를 출력해주면 되는 문제

필요한 변수 : 수포자 3명이 답을 찍는 방식이 담긴 2차원 배열 , 각 수포자 마다 맞춘 점수를 저장할 배열 , 최고 득점자를 찾기위한 변수(수포자의 점수와 비교하고 고득점자가 누군지 찾기위한) ,최고득점자를 담을 리스트 변수

수포자 3명이 주어지고 3명이 찍는 방식이 주어진다.
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 가 반복된다
이 규칙을 2차원 배열에 저장

각 수포자마다의 점수를 파악하기 위해선 문제의 답과 수포자의 찍은답이 일치할 경우 포인트를 추가한다
(문제의 번호 % 수포자들이 찍는 번호가 반복되는 갯수)를 하면 각 문제 번호에 어떤 점수를 입력했는지를 알 수 있다.

pointCopy변수에 clone()을 통해 점수를 복사해두고 최고 득점자를 찾기위해 Arrays.sort() 사용 max에 넣어준다.
point변수의 길이만큼 for문을 실행한 뒤 수포자의 점수와 max를 비교하는 조건문을 넣어주고 최고 득점자를 찾을시 list변수에 수포자의 번호를 넣어준다.

마지막으로 가장 높은 점수를 받은 사람이 여럿일 경우 오름차순 정렬하라는 제한 조건을 지키기 위해
for문을 한번더 실행하여 answer 배열에 list의 값을 넣어주면 완성.

 

[코드]

import java.util.*;

class Solution {
    public int[] solution(int[] answers) {
        int[][]mathThrower={
            {1, 2, 3, 4, 5},
            {2, 1, 2, 3, 2, 4, 2, 5},
            {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
        };
        int[] point={0,0,0};
        int[] pointCopy={};
        int max = 0;
        
        List<Integer> list = new ArrayList<>();
        
        for(int i=0;i<answers.length; i++){
            if(mathThrower[0][i%5]==answers[i]){
                point[0]++;
            }if(mathThrower[1][i%8]==answers[i]){
                point[1]++;
            }if(mathThrower[2][i%10]==answers[i]){
                point[2]++;
            }
        }
        
        pointCopy = point.clone();      //최다 득점자 찾아내기 위해 복사
        Arrays.sort(pointCopy);
        max = pointCopy[2];
        
        for(int i =0; i<point.length;i++)
        {
            if(point[i] == max){
                list.add(i+1);
            }
        }
        
        int[] answer = new int[list.size()];
        for(int i=0; i<answer.length; i++){     //가장 높은 점수를 받은 사람이 여럿일 경우,return하는 값을 오름차순 정렬
            answer[i] = list.get(i);
        }
    
        return answer;
    }
}