Maenya's Techlog

20201205 코딩 문제풀이 - 수포자 문제 본문

개발자의 삶/코딩 문제풀이

20201205 코딩 문제풀이 - 수포자 문제

ming235 2020. 12. 5. 02:37

 

[프로그래머스 수포자 문제]

 

문제 설명

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

입출력 예

answersreturn

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

입출력 예 설명

입출력 예 #1

  • 수포자 1은 모든 문제를 맞혔습니다.
  • 수포자 2는 모든 문제를 틀렸습니다.
  • 수포자 3은 모든 문제를 틀렸습니다.

따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.

입출력 예 #2

  • 모든 사람이 2문제씩을 맞췄습니다.

 

 

 

[풀다가 깨달은 것]

1. int[] 형태의 리스트는 미리 배열의 사이즈를 지정해주어야 add가 된다. (ArrayList는 안해줘도 그때그때 add됨)

int[] answer = new int[N];

2. Array.sort({LIST});   // 오름차순 설정

3. 반복되는 패턴을 미리 지정해두고, 순번만큼 나눈 값의 나머지가 반복될때 패턴의 순번과 같다.

 

 

import java.util.*; // 이거 임포트 해두고 시작하기
    
    class Solution {
        public int[] solution(int[] answers) {
            
            int[] answer = {};
            int cnt = answers.length; // 시험문제 수
            int equal1 = 0; // 수포자1 정답수
            int equal2 = 0; // 수포자2 정답수
            int equal3 = 0; // 수포자3 정답수
            
            
            // 수포자들의 답안지 (반복)
            int[] math1 = {1, 2, 3, 4, 5};
            int[] math2 = {2, 1, 2, 3, 2, 4, 2, 5};
            int[] math3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

            for (int i = 0; i < cnt; i++) {
                // 정답의 문제순번을 반복하는 답안의 개수로 나누면 그 순번에 그 자가 답한 값이 나온다.
                if (answers[i] == math1[i % math1.length]) {
                    equal1 += 1;
                }
                if (answers[i] == math2[i % math2.length]) {
                    equal2 += 1;
                }
                if (answers[i] == math3[i % math3.length]) {
                    equal3 += 1;
                }
            }
            
            int[] equalCnt = {equal1, equal2, equal3};  // 수포자들의 정답수 배열
            Arrays.sort(equalCnt);  // 오름차순으로 sort한다.
            int max = equalCnt[2];  // 마지막 자리가 최대수
            
            ArrayList<Integer> maxList = new ArrayList<Integer>();
            // ArrayList를 써야 그때그때 add해줄 수 있으니까
            if (equal1 == max) { 
                maxList.add(1);
            }
            if (equal2 == max) {
                maxList.add(2);
            }
            if (equal3 == max) {
                maxList.add(3);
            }
                
            answer = new int[maxList.size()];
            // int[] 형태는 미리 length를 선언해 주어야 한다.(정답자들의 수만큼)
            for (int j=0; j<maxList.size(); j++) {
                answer[j] = maxList.get(j);
            }
            
            
            System.out.println("수포자1의 답개수 : " + equal1); // test
            
            return answer;
        }
    }

 

 

'개발자의 삶 > 코딩 문제풀이' 카테고리의 다른 글

20201205 코딩문제풀이 - 체육복  (0) 2020.12.05
20201205 코딩문제풀이 - K번째수  (0) 2020.12.05
중간 과제물 문제 풀이  (0) 2020.05.05
문제풀이5  (0) 2020.03.08
문제풀이4  (0) 2020.03.08