본문 바로가기

알고리즘

[알고리즘/Programmers] LV1. 모의 고사

728x90
반응형

Programmers LV1. 모의 고사

 

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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]


사용 언어

Java

해결 방법

key point는 for문 내부에서 answers의 인덱스를 찍은방식이 담긴 배열의 길이을 나눈 나머지를 구하는 것이다. 그것을 인덱스로 조회하는 찍은방식의 배열과 answers를 비교한다.

이렇게 나머지 연산자를 사용할 경우 찍은방식의 배열의 길이가 5일 때 0,1,2,3,4,0,1,2,3,4 ... 가 나머지 값으로 나온다. answers의 i를 통해 찍은방식의 배열의 값에 접근할 수 있다.

 

알게된 것

  • 최대값 쉽게 구하기
    • Math.max(a,b)
  • 스트림 문법으로 List->배열 변환
    • list.stream().mapToInt(i->i.intValue()).toArray();
    • 단 속도 저하가 있을 수 있다. 속도에 민감한 문제는 주의할 것!!

 

코드

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

/*
    모의 고사
 */
public class test_42840 {
    public static void main(String[] args) {
        int[] answers = {1,3,2,4,2};
        int[] result = solution(answers);
        for(int i=0; i<result.length; i++) {
            System.out.print(result[i] + ", ");

        }

    }

    static public int[] solution(int[] answers) {
        int[] pattern1 = {1,2,3,4,5};
        int[] pattern2 = {2,1,2,3,2,4,2,5};
        int[] pattern3 = {3,3,1,1,2,2,4,4,5,5};
        int answer1=0, answer2 =0, answer3 =0;
        List<Integer> result = new ArrayList<>();

        for(int i=0; i<answers.length; i++) {
            if(pattern1[i % pattern1.length] == answers[i]) answer1++;
            if(pattern2[i % pattern2.length] == answers[i]) answer2++;
            if(pattern3[i % pattern3.length] == answers[i]) answer3++;
        }

        int max = Math.max(Math.max(answer1, answer2), answer3);

        if(answer1 == max) result.add(1);
        if(answer2 == max) result.add(2);
        if(answer3 == max) result.add(3);

        int[] resultArr = new int[result.size()];
        for(int i=0; i<resultArr.length; i++) {
            resultArr[i] = result.get(i);
        }

        return resultArr;
    }

    static public int[] solution2(int[] answer) {
        int[] a = {1, 2, 3, 4, 5};
        int[] b = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] c = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
        int[] score = new int[3];
        for(int i=0; i<answer.length; i++) {
            if(answer[i] == a[i%a.length]) {score[0]++;}
            if(answer[i] == b[i%b.length]) {score[1]++;}
            if(answer[i] == c[i%c.length]) {score[2]++;}
        }
        int maxScore = Math.max(score[0], Math.max(score[1], score[2]));
        ArrayList<Integer> list = new ArrayList<>();
        if(maxScore == score[0]) {list.add(1);}
        if(maxScore == score[1]) {list.add(2);}
        if(maxScore == score[2]) {list.add(3);}
        return list.stream().mapToInt(i->i.intValue()).toArray();
    }
}
728x90
반응형