본문 바로가기

코딩/프로그래머스

[프로그래머스/JAVA] 고득점Kit > 완전탐색 > 모의고사 (by 다알쥐AI)

728x90

고득점Kit > 완전탐색 > 모의고사

 

 

※ 주의 : 문제풀이 방법은 다양합니다. 참고만 해주세요 

[문제설명]

더보기

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

입출력 예


입출력 예 설명

입출력 예 #1

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

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

입출력 예 #2

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

[간단설명]

수포자 3명중 정답을 가장 많이 맞춘 사람을 리턴하는 문제

 

[접근방법]

1. 수포자 1, 2, 3 의 답안 배열을 만든다.

2. 각각 정답 개수를 기록한다.

3. 정답 개수 MAX를 구한다.

4. 정답 개수 MAX인 수포자를 리스트에 추가한다.

5. 수포자 리스트를 배열로 리턴한다.

 

[주의사항]

- 수포자 1, 2, 3의 답안 배열을 만들고, 정답 개수만큼 for문을 어떻게 돌지 고민이 필요하다.

- 여기서는 나머지(%) 를 수포자 배열의 index로 사용

 

[소스공개]

import java.util.*;
class Solution {
    public int[] solution(int[] answers) {
        
        // 수포자 1,2,3 정답 배열 만들기
        int[] one = new int[]{1,2,3,4,5};
        int[] two = new int[]{2,1,2,3,2,4,2,5};
        int[] three = new int[]{3,3,1,1,2,2,4,4,5,5};
        
        // 정답 개수 카운트 배열(0은 버림)
        int[] cnt = new int[4];
        
        // 리턴용 List -> 제출할 때 array로 만들 예정
        List<Integer> list = new ArrayList<>();
        
        // 수포자 1,2,3의 정답 개수를 카운트
        for(int i=0;i<answers.length;i++){
            if(answers[i]==one[i%one.length]){
                cnt[1]+=1;
            }
            if(answers[i]==two[i%two.length]){
                cnt[2]+=1;
            }
            if(answers[i]==three[i%three.length]){
                cnt[3]+=1;
            }
        }
        // 정답개수 맥스값 찾음
        int max = 0;
        for(int i=1;i<cnt.length;i++){
            max = Math.max(max,cnt[i]);
        }
        
        // 맥스값과 일치하는 경우, 수포자 순서대로 리스트에 추가
        for(int i=1;i<cnt.length;i++){
            if(max==cnt[i]) list.add(i);
        }
        
        // 리스트를 배열로 리턴
        return list.stream().mapToInt(Integer::intValue).toArray();
    }
    
}

 

[실행결과]

728x90