문제

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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. 문제에서 주어진 수포자들이 문제를 찍는 방식을 각각 배열 담는다.

var one = arrayOf(1,2,3,4,5)
var two = arrayOf(2,1,2,3,2,4,2,5)
var three = arrayOf(3,3,1,1,2,2,4,4,5,5)

 

2. 수포자들이 문제를 맞췄을 때 count할 배열을 생성한다.

var ans = IntArray(3, {0})

 

3. 정답이 담긴 answers를 반복한다.

반복문 안에서 1,2,3 수포자들이 맞춘 문제의 수를 count한다.

1번 수포자의 경우 1,2,3,4,5를 반복하고 문제의 수는 5개보다 많을 수도 있기 때문에 인덱스는 idx % 5로 했고

현재의 정답과 1번 수포자가 찍는 방식의 번호가 같다면 +1을 한다.

2,3번 수포자도 마찬가지다.

for((idx, answer) in answers.withIndex()){
    //1번 수포자
    if(answer == (one[idx % 5])){
        ans[0]++
    }

    //2번 수포자
    if(answer == (two[idx % 8])){
        ans[1]++
    }

    //3번 수포자
    if(answer == (three[idx % 10])){
        ans[2]++
    }
}

 

4. ans에 담긴 값들 중 가장 큰 값을 max에 담는다.

var max = ans.maxOrNull()

 

5. 반복문을 돌면서 max와 같다면 현재의 idx를 answer에 담는다. +1을 하는 이유는 인덱스는 0부터 시작해서 현재 1번 수포자는 인덱스 0번을 뜻하기 때문이다.

for((idx, a) in ans.withIndex()){
    if(max == a){
        answer += idx+1
    }
}

 

코드

class Solution {
    fun solution(answers: IntArray): IntArray {
        var answer = intArrayOf()
        
        var one = arrayOf(1,2,3,4,5)
        var two = arrayOf(2,1,2,3,2,4,2,5)
        var three = arrayOf(3,3,1,1,2,2,4,4,5,5)
        
        var ans = IntArray(3, {0})
        
        for((idx, answer) in answers.withIndex()){
            //1번 수포자
            if(answer == (one[idx % 5])){
                ans[0]++
            }
            
            //2번 수포자
            if(answer == (two[idx % 8])){
                ans[1]++
            }
            
            //3번 수포자
            if(answer == (three[idx % 10])){
                ans[2]++
            }
        }
        // ans.forEach{print("$it ")}
        
        var max = ans.maxOrNull()
        
        for((idx, a) in ans.withIndex()){
            if(max == a){
                answer += idx+1
            }
        }
        
        return answer
    }
}

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/42840

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

나연쓰