🕵️문제설명

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

🔎로직설명

학생별로 하나하나 조건문

fun solution(answers: IntArray): IntArray {
    var answer = mutableListOf<Int>()
    var student1 = 0
    var student2 = 0
    var student3 = 0

    for ((i, v) in answers.withIndex()) {
        if ((i + 1) % 5 == v) student1++
        if (i % 2 == 0 && v == 2) student2++
        when (i % 8) {
            1 -> if (v == 1) student2++
            3 -> if (v == 3) student2++
            5 -> if (v == 4) student2++
            7 -> if (v == 5) student2++
        }
        when (i % 10) {
            in 0..1 -> if (v == 3) student3++
            in 2..3 -> if (v == 1) student3++
            in 4..5 -> if (v == 2) student3++
            in 6..7 -> if (v == 4) student3++
            in 8..9 -> if (v == 5) student3++
        }
    }

    val maxScore = maxOf(student1,student2,student3)

    if (student1 == maxScore) answer.add(1)
    if (student2 == maxScore) answer.add(2)
    if (student3 == maxScore) answer.add(3)
    return answer.toIntArray()
}

withIndex를 이용해 반복문으로 각 학생들의 점수를 매겨주는 방식으로 만들고 masOf를써 최고점이면 answer에 추가하게 만들었다

너무 비효율적이고 추가되는 학생이 있으면 쓰기 불편하다

패턴

fun solution(answers: IntArray): IntArray {
    var patterns = arrayOf(
        intArrayOf(1, 2, 3, 4, 5),
        intArrayOf(2, 1, 2, 3, 2, 4, 2, 5),
        intArrayOf(3, 3, 1, 1, 2, 2, 4, 4, 5, 5)
    )
    val score = intArrayOf(0,0,0)
    for (i in 0 until answers.size){
        if (answers[i] == patterns[0][i % patterns[0].size]) score[0]++
        if (answers[i] == patterns[1][i % patterns[1].size]) score[1]++
        if (answers[i] == patterns[2][i % patterns[2].size]) score[2]++
    }
    val maxScore = score.max()

    return score.indices.filter { score[it] == maxScore }.map { it + 1 }.toIntArray()
}

패턴을 배열로 만들어 준후 패턴[문제 번호 % 패턴크기]의 값이 정답이면 스코어 배열에서 점수가 오르고

제일 높은 점수를 사람이 여럿일수 있으니 indices를 써서 모든 원소를 살피고

filter로 maxScore와 같은 원소를 찾고 그 인덱스값에 1을 더해줬다

근데 반복문안에 비슷한 if문만 3개인데 이걸 또 간략하게 할 수 없을까? 생각했다

반복문이니까 forEachIndexed를 써보자

answers.forEachIndexed { i, v -> if (v == i % patterns

여기서 어떻게 해야할까?

위에 코드에선 answers의 위치값범위 지정하고 반복시키면 됬는데 if문을 줄이니까 patterns[n]의 위치값도 필요하게 된것

answers.forEachIndexed { i, answer -> 
        patterns.forEachIndexed { j, pattern ->

패턴도 forEachIndexed를 해주자

    fun solution(answers: IntArray): IntArray {
        var patterns = arrayOf(
            intArrayOf(1, 2, 3, 4, 5),
            intArrayOf(2, 1, 2, 3, 2, 4, 2, 5),
            intArrayOf(3, 3, 1, 1, 2, 2, 4, 4, 5, 5)
        )
        val score = intArrayOf(0, 0, 0)

        answers.forEachIndexed { i, answer ->
            patterns.forEachIndexed { j, pattern ->
                if (answer == pattern[i % pattern.size]) score[j]++
            }
        }
        val maxScore = score.maxOrNull()

        return score.indices.filter { score[it] == maxScore }.map { it + 1 }.toIntArray()
    }

0개의 댓글