알고리즘_34번-2021.11.11

Jonguk Kim·2021년 11월 11일
0

알고리즘

목록 보기
11/15

1. 문제: 모의고사

  • 문제 설명

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

  • 입출력 예


2. 설계 및 구현

  • 분류
    • 입력값: 정수형 배열 int[]
    • 처리: 1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열이 주어졌을 때, 가장 많은 문제를 맞힌 사람
    • 출력값: 정수형 배열 int[]
  • 생각
    • 수포자별 찍는 방식 int[] 배열로 저장
    • 수포자들 답과 답안지 비교해서 맞으면 카운트 증가
    • 카운트한 걸 오름차순 정렬
    • 가장 높게 맞은 사람이 누구인지 찾음
  • 성공코드
import java.util.*;

class Solution {
    public int[] solution(int[] answers) {
        ArrayList<Integer> list = new ArrayList<>();
        
        // 1. 수포자 찍는 방식
        int[] giveup_1 = {1, 2, 3, 4, 5};
        int[] giveup_2 = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] giveup_3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
        
        int[] scores = {0, 0, 0};
        
        // 2. 수포자 맞은 개수
        for (int i = 0; i < answers.length; i++){
            if (giveup_1[i%5] == answers[i])
                scores[0]++;
            if (giveup_2[i%8] == answers[i])
                scores[1]++;
            if (giveup_3[i%10] == answers[i])
                scores[2]++;    
        }
        
        // 3. 맞은 개수 오름차순
        int[] arr = new int[scores.length];
        for (int i = 0; i < scores.length; i++)
            arr[i] = scores[i];
        
        Arrays.sort(arr);
        
        // 4. 2번 / 3번 갯수가 같은 사람 뽑아냄
        
        for (int i = 0; i < arr.length; i++)
            if (scores[i] == arr[2])
                list.add(i+1);
        
        // 5. 리턴
        int[] answer = new int[list.size()];
        for (int i = 0; i < list.size(); i++)
            answer[i] = list.get(i);
        
        return answer;
    }
}

3. 배운 것 / 느낀점

  • 성공코드: 수포자 찍는 방식 갯수 만큼을 반복문 돌면서 확인하는 것 생각 못함
profile
개발일지

0개의 댓글