티스토리 뷰

 

문제 설명

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

입출력 예

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

입출력 예 설명

입출력 예 #1

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

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

 

입출력 예 #2

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

 

내 초기 코드

 - 풀다가 포기함.

 - 결과 확인과 학생을 오름차순으로 나열하는 부분에서 막힘.

 - 답 비교하는 부분도 뭔가 난잡함.

        int[] answers = {1, 2, 3, 4, 5, 1, 2, 3, 4};
        
        int[] s1 = {1, 2, 3, 4, 5};
        int[] s2 = {2, 1, 2, 3, 2, 4, 2 ,5};
        int[] s3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
        
        int resultS1 = 0;
        int resultS2 = 0;
        int resultS3 = 0;
        
        int cutS1 = 0;
        int cutS2 = 0;
        int cutS3 = 0;
        int[] answer = {};
        
        
        // 수포자들과 답 비교.
        for (int i = 0; i < answers.length; i++) {
            if (answers[i] == s1[cutS1]) {
                resultS1++;
                cutS1++;
                if (cutS1 == s1.length) {
                    cutS1 = 0;
                }
            }
            if (answers[i] == s2[cutS2]) {
                resultS2++;
                cutS2++;
                if (cutS2 == s2.length) {
                    cutS2 = 0;
                }
            }
            if (answers[i] == s3[cutS3]) {
                resultS3++;
                cutS3++;
                if (cutS3 == s3.length) {
                    cutS3 = 0;
                }
            }
            
        }
        //결과 비교
        int con;
        con = (resultS1 > resultS2)? resultS1: resultS2;
        int con2 = (resultS3 > con)? resultS3: con;
        System.out.println(resultS1);
        System.out.println(resultS2);
        System.out.println(resultS3);
        System.out.println(con);
        System.out.println(con2);

 
        
        // 3항 연산자 
        

 

- Best Answer

package programmers.codingtest.level1;

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

public class MockTest {
    public static void main(String[] args) {

    }
    
    public int[] solution(int[] answers) {
        // 수포자의 찍기 패턴 수 st1 = 5, st2 = 8, st3 =10
        int[] st1 = {1, 2, 3, 4, 5};
        int[] st2 = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] st3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
        
        //3명의 학생이므로 정답을 체크하기 위한 배열 cnt 생성
        int[] cnt = new int [3];
        
        // 정답과 찍은답을 비교하여 동일한 경우 cnt ++
        for (int i = 0; i < answers.length; i++) {
            if (answers[i] == st1[i % 5]) {
                cnt[0]++;
            }
            if (answers[i] == st2[i % 8]) {
                cnt[1]++;
            }
            if (answers[i] == st3[i % 10]) {
                cnt[2]++;
            }
        }
        
        // 1번 학생을 winner로 잡고 차례대로 비교하여 가장 높은 점수 확인
        int winner = cnt[0];
        for (int i = 0; i < cnt.length; i ++) {
            if (winner < cnt[i]) {
                winner = cnt[i];            }
        }
        
        // 가장 높은 점수를 받은 학생 List 생성
        List<Integer> win = new ArrayList<>();
        
        // cnt 배열과 가장 높은 점수를 비교하여 동일한 경우 win List에 추가 (학생 추가)
        for (int i = 0; i < cnt.length; i++) {
            if(winner == cnt[i]) {
                win.add(i);
            }
        }
        
        int[] answer = {}; // 출력값
        // 출력값은 win List에 추가된 학생 수와 동일하도록 길이 조정
        answer = new int[win.size()];
        
        // 출력할 배열 answer에 win List에 있는 학생번호 입력
        for (int i = 0; i < win.size(); i++) {
            // index는 0부터 시작하고 학생번호는 1부터 시작하므로 1씩 더해줌.
            answer[i] = win.get(i) + 1;
        }
        
        return answer;
    }
}

 

 

 

- Check Point

 1) 수포자들의 답과 answers을 비교하는 반복을 수행할 때 몇 번 시행할 것인지.

   -> 내 코드에서는, 각 답체크 시행에 범위를 주기위해 cut변수를 사용했지만, Best answer에서는 %를 사용하여 간단하게 해결함.

 2) 결과비교시에 기준값을 잡고 비교하기.

   -> 채점 결과를 어떻게 비교해야할지 엄청 고민했고, 결국거기서 막혔지만, best answer에서는 기준값을 잡고 반복문을 통해 결과를 확인.

 3) 비교한 결과에 따라 학생 순위 나열.

  -> 채점 결과를 통해 학생 순위를 나누는 배열 작업을 Array리스트를 통해 수행하며, 학생수의 시작점과 인덱스의 시작점의 차이를 파악하여 +1을 해주는 것이 point

 

- 더 공부할점

 1) Best Answer 좀 더 간결하게 하기 (ArrayList사용한 부분 부터 answer배열에 학생채우는 부분까지 간결히)

 

 

* 코드 출처

 - (https://eunsamar.tistory.com/89)

'Algorithm > Algorithm Practice' 카테고리의 다른 글

BST  (0) 2020.03.08
프로그래머스 -6 정수 내림차순으로 배치하기(Java)  (0) 2020.02.29
8. Recursion -3 (Java)  (0) 2020.02.28
7. Recursion -2 (Java)  (0) 2020.02.27
6. Recursion (Java)  (0) 2020.02.27
댓글