프로그래머스 완전탐색 "모의고사"

yeon_taetae·2021년 6월 20일
0

프로그래머스

목록 보기
10/10

📝문제

📌문제 링크

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

📌문제 설명

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

📌입출력 예

📝코드

import java.util.Collections.max
class Solution {
     fun solution(answers: IntArray): IntArray {
        var answer = intArrayOf()
        var result_List: MutableList<Int> = mutableListOf()
        var cal_List: MutableList<Int> = mutableListOf()
        var a1: IntArray = intArrayOf(1,2,3,4,5)
        var a2: IntArray = intArrayOf(2,1,2,3,2,4,2,5)
        var a3: IntArray = intArrayOf(3,3,1,1,2,2,4,4,5,5)
        var s1: Int = cal_Count(a1, answers)
        var s2: Int = cal_Count(a2, answers)
        var s3: Int = cal_Count(a3, answers)
        result_List.add(s1)
        result_List.add(s2)
        result_List.add(s3)

        for(i in 0..result_List.size-1){
           if(max(result_List) == result_List[i]){
               cal_List.add(i+1)
           }
        }
        answer = cal_List.toIntArray()
        return answer
    }

    fun cal_Count(score_Array: IntArray, data_Array: IntArray): Int{
        var count: Int = 0
        if(score_Array.size < data_Array.size){
            for(i in 0..data_Array.size-1){
                var j: Int = i%score_Array.size
                if(score_Array[j] == data_Array[i]){
                    count++
                }
            }
        }
        else{
            for(i in 0..data_Array.size-1){
                if(score_Array[i] == data_Array[i]){
                    count++
                }
            }
        }
        return count
    }
}

📝참고사항

핵심은 이 부분이다.

시험문제의 정답이(data_Array)가 찍는 학생의 주기(score_Array)보다 많았을 때이다.
예를들어 data_Array.size가 10, score_Array.size가 5라면 score_Array[5]가 되는순간에 IndexOutOfBoundsException오류가 발생한다.
따라서 score_Array[5]가 score_Array[0]값이 될 수 있도록 배열을 순환 시켜줄 필요가 있다.
그래서 var j: Int = i%score_Array.size를 넣어줘서 score_Array가 계속 순환할 수 있도록 조치했다.

위의 코드는 수포자 3명에게만 해당되는 코드라 범용성이 모자른것이 사실이다.. 시간이 없어 알고리즘 중점만 했다.
다음시간에는 범용성있게 조정하는 시간을 가져보겠다.

0개의 댓글