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

[Java][프로그래머스] 모의고사

by wave_m 2020. 10. 7.
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은 모든 문제를 틀렸습니다.

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

입출력 예 #2

  • 모든 사람이 2문제씩을 맞췄습니다.
import java.util.Arrays;
import java.util.ArrayList;
class Solution {
    public int[] solution(int[] answers) {
        int[] su1 = {1,2,3,4,5};
        int[] su2 = {2,1,2,3,2,4,2,5};
        int[] su3 = {3,3,1,1,2,2,4,4,5,5};
        int[] count = new int[3];
        for(int i =0;i<answers.length; i++){
            if(answers[i]==su1[i%su1.length]){
                count[0]++;
            }
            if(answers[i]==su2[i%su2.length]){
                count[1]++;
            }
            if(answers[i]==su3[i%su3.length]){
                count[2]++;
            }
        }
        int max = Math.max(Math.max(count[0], count[1]), count[2]);
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < count.length; i++) {
            if (count[i] == max)
                list.add(i + 1);
        }
       
       int[] answer = new int[list.size()];
        for (int i = 0; i < answer.length; i++) {
            answer[i] = list.get(i);
        }
        return answer;
    }
}

 

알고리즘 풀이 : 

1. 각 수포자들이 찍는 방법에 대한 방식을 s1, s2, s3을 int[] 타입으로 각 방법으로 초기화 하여 선언

2. 문제를 맞힌 수를 기록하기 위해 int[] 타입의 count를 크기 3으로 선언

3. i가 answers.length-1이 될때까지 for 문을 반복

1) answer[i]가 s1[i%su1.length]과 같을 경우 count[0]을 증가

2) answer[i]가 s2[i%su2.length]과 같을 경우 count[1]을 증가

3) answer[i]가 s3[i%su3.length]과 같을 경우 count[2]을 증가

- i를 su1.length로 나누었을 때 나오는 나머지를 su1에 넣으면 i번 찍는 방법을 알 수 있음

4. int 타입 max를 Math.max로 count[0]와 count[1]를 먼저 비교하고 그 중 큰 하나를 count[2]와 Math.max로 비교하고 그 중 큰 값을 max에 대입

5. list를 ArrayList로 Integer 타입으로 선언

6. i가 count.length-1이 될 때까지 for문을 반복

- count[i]가 맥스라면 list에 i+1을 대입

7. 반환할 answer을 int[] 타입으로 선언하고 list.size 크기로 선언

- list의 크기(혹은 길이)는 length가 아닌 size를 사용

8. i가 answer.length-1이 될 때까지 for문을 반복하여 answer[i]에 list에 i번째 항목을 가져와 저장

9. return을 사용하여 answer을 반복

 

 

 

728x90