본문 바로가기
Coding Test/프로그래머스

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

by CSEGR 2024. 2. 27.
728x90
문제 설명 

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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]

 

 

문제 해결 

 

1. 사람 1,2,3이 찍는 정답 패턴을 배열로 선언

2. 정답 패턴은 반복되기 때문에( 2016 문제와 동일한 개념 ) 패턴과 정답 배열 answers 를 비교하여 각자 맞춘 점수를 구한다. 

3. 정답을 가장 맞힌 사람을 구하고 결과값을 출력한다. 

import java.util.List;
import java.util.ArrayList;
class Solution {
    public List<Integer> solution(int[] answers) {
       
        int[] one = {1,2,3,4,5};
        int[] two = {2,1,2,3,2,4,2,5};
        int[] three = {3,3,1,1,2,2,4,4,5,5};
        int[] total = new int[3];
        for(int i = 0; i< answers.length; i++)
        {
             if(one[i%5] == answers[i]) total[0]++;
             if(two[i%8] == answers[i]) total[1]++;
             if(three[i%10] == answers[i]) total[2]++;
        }
   }
}

여기서 정답을 가장 맞힌 사람을 구하고 결과값을 어떻게 출력하느냐에서 막혔다. 

사실 굉장히 단순한 문제이다. 

 

우선, 여러 알고리즘을 참고하다가 return 자료형에 int[] 보다 List<Integer>이 더 효율적인 것 같아서 바꿨다. 

이유는 이 문제의 경우 max값이 1개인지 2개인지 3개인지 모르는 경우이기 때문에, Resizable Array인 List 자료형을 쓰는 편이 좋아보인다. 

// 이후 코드 
	int max = Math.max(total[0], Math.max(total[1], total[2]));
        List<Integer> max_arr = new ArrayList<>();
        for(int i = 0; i<3; i++)
        {
            if(max == total[i]) max_arr.add(i+1);
        }
        return max_arr;

• 우선 max를 구하기 위해 Math.max 함수를 써줬다.

   - 3개의 수를 비교할때는 Math.max( 1, Math.max(2,3)); 이렇게 써주면 편리하게 사용가능하다. 

• for문을 사용하여 max인 인덱스 찾아서 return 할 List에 add하기.

   - 이렇게 쓰면 문제에서 요구한 "return 하는 값을 오름차순으로 정렬"을 동시에 해결 가능하다 !! 

 

최종코드 
import java.util.List;
import java.util.ArrayList;
class Solution {
    public List<Integer> solution(int[] answers) {
       
        int[] one = {1,2,3,4,5};
        int[] two = {2,1,2,3,2,4,2,5};
        int[] three = {3,3,1,1,2,2,4,4,5,5};
        int[] total = new int[3];
        for(int i = 0; i< answers.length; i++)
        {
             if(one[i%5] == answers[i]) total[0]++;
             if(two[i%8] == answers[i]) total[1]++;
             if(three[i%10] == answers[i]) total[2]++;
        }
        int max = Math.max(total[0], Math.max(total[1], total[2]));
        List<Integer> max_arr = new ArrayList<>();
        for(int i = 0; i<3; i++)
        {
            if(max == total[i]) max_arr.add(i+1);
        }
        return max_arr;
    }
}

 

실행 결과 

 

728x90