본문 바로가기

Algorithm/프로그래머스

완전탐색 - 모의고사

반응형

완전탐색 - 모의고사(programmers.co.kr/learn/courses/30/lessons/42840) 를 풀어봤습니다.

 

    fun Level_1_모의고사(answers: IntArray): IntArray {
        var answer = intArrayOf()

        val test01 = arrayOf(1, 2, 3, 4, 5)
        val test02 = arrayOf(2, 1, 2, 3, 2, 4, 2, 5)
        val test03 = arrayOf(3, 3, 1, 1, 2, 2, 4, 4, 5, 5)

        val map = hashMapOf<Int, Int>()
        answers.forEachIndexed { index, i ->
            if (i == test01[index%5]) map[1] = map.getOrDefault(1, 0) + 1
            if (i == test02[index%8]) map[2] = map.getOrDefault(2, 0) + 1
            if (i == test03[index%10]) map[3] = map.getOrDefault(3, 0) + 1
        }
        var max = Int.MIN_VALUE
        map.entries.forEach {
            if (max < it.value) {
                max = it.value
            }
        }
        val result = mutableListOf<Int>()
        map.entries.forEach {
            if (it.value == max) {
                result.add(it.key)
            }
        }

        answer = result.toIntArray()
        return answer
    }

저는 위 처럼 map 이라는 함수를 이용해 값이 있으면 +1을, 없으면 0을 넣는 getOrDefault 를 사용해 첫번째, 두번째, 세번째 사람의 정답 개수를 넣었습니다.

그 후 가장 많이 맞춘 개수를 구했고,

max와 같은 개수의 문제를 맞춘 정답자를 list로 add시켜, 그걸 마지막에 toIntArray() 함수를 통해 결과를 도출했습니다.

 

그 후, 문제의 정답자의 답안지를 보니, 더 깔끔한 코드가 있어 가져와봤습니다.

 

    fun Level_1_모의고사(answers: IntArray): IntArray {
        var answer = intArrayOf()

        val test01 = arrayOf(1, 2, 3, 4, 5)
        val test02 = arrayOf(2, 1, 2, 3, 2, 4, 2, 5)
        val test03 = arrayOf(3, 3, 1, 1, 2, 2, 4, 4, 5, 5)

        val map = mutableMapOf(Pair(1, 0), Pair(2, 0), Pair(3, 0))
        answers.forEachIndexed { index, i ->
            if (i == test01[index%5]) map[1] = map[1]!! + 1
            if (i == test02[index%8]) map[2] = map[2]!! + 1
            if (i == test03[index%10]) map[3] = map[3]!! + 1
        }

        val max = map.maxByOrNull {	// 프로그래머스 답을 쓸때는 maxBy를 사용해야 합니다.
            it.value
        }?.value
        for (i in 1 .. map.size) {
            if (map[i] != max)
                map.remove(i)
        }
        answer = map.toList().sortedWith(compareBy {
            it.second
        }).toMap().keys.toIntArray()

        return answer
    }

 

보시다시피, map에 값을 넣는건 같지만, 미리 key-value를 할당해주고 +1해주는 식으로 구현했습니다.

거기서 maxBy 함수를 이용해 max값을 찾고, max값과 맞지 않다면 remove해줬습니다.

그 후 sortedWith함수를 이용해 정리했고, 그걸 다시 key 순서대로 맞췄습니다.

이게 더 많은 함수도 사용해보고 깔끔한거 같네요.

반응형

'Algorithm > 프로그래머스' 카테고리의 다른 글

완전탐색 - 카펫  (0) 2021.02.04
정렬 - H-index  (0) 2021.01.13
정렬 - 가장 큰 수  (0) 2021.01.12
정렬 - K번째 수  (0) 2021.01.12
해시 - 완주하지 못한 선수  (0) 2020.12.30