Kotlin/Algorithm Problems

<프로그래머스> 혼자 놀기의 달인(Lv.2)

re트 2024. 1. 22. 09:41
728x90

[깃허브]

https://github.com/heesoo-park/ForCodeKata/tree/main/%ED%98%BC%EC%9E%90%20%EB%86%80%EA%B8%B0%EC%9D%98%20%EB%8B%AC%EC%9D%B8

[프로그래머스]

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

제출 결과

 

주말 간의 피로를 잠으로 잘 풀고 눈 퉁퉁 부어 있는 상태에서 푸는 월요일 첫 문제는 문제 지문을 읽고 이해하는 게 제일 힘들었다.

안 그래도 머리가 안 돌아가는데 지문까지 기니까... 쉽지 않았다.

코드 작성 시간이랑 문제 읽는 시간이랑 삐까삐까 했던 거 같다.

 

이 문제는 간단하게 사이클 문제라고 볼 수 있었던 거 같다.

각각의 사이클을 이루는 원소의 개수를 가지고 답을 도출하는 거였기 때문이다.

 

DFS까지 가야될까 싶어 그냥 반복문으로 해결을 했는데 오히려 더 깔끔한 거 같기도 하다.

방문 체크를 위한 배열, 사이클 원소의 개수를 각각 저장할 배열리스트를 만들고 반복문을 통해 각 사이클을 추적했다.

그리고나서 배열리스트를 내림차순으로 정렬한 다음에 가장 큰 점수를 얻게 할 첫번째와 두번째 원소값을 곱해서 반환했다.

 

여기서 한 가지 케이스에 대해 런타임에러가 났었는데 그건 배열리스트에 한 개의 값만 들어있는 경우를 생각하지 않았기 때문에 발생한 거였다.

문제에서 한 그룹으로 게임이 종료되면 0점을 반환해야한다고 했는데 그걸 놓친거였다.

그걸 위해 배열리스트의 크기가 1인지 확인을 하고 이에 맞춰 문제가 원하는 값을 반환했다.

 

해당 방법으로 작성한 코드는 다음과 같다.

class Solution {
    private lateinit var visited: Array<Boolean>
    fun solution(cards: IntArray): Int {
        visited = Array(cards.size) { false }
        val groupCount = ArrayList<Int>()

        for (i in cards.indices) {
            if (visited[i].not()) groupCount.add(checkGroup(cards, i))
        }

        groupCount.sortDescending()
        return if (groupCount.size == 1) 0 else groupCount[0] * groupCount[1]
    }

    private fun checkGroup(cards: IntArray, num: Int): Int {
        var count = 0
        var curPos = num
        visited[curPos] = true
        count++

        while (visited[cards[curPos] - 1].not()) {
            curPos = cards[curPos] - 1
            visited[curPos] = true
            count++
        }

        return count
    }
}
반응형

'Kotlin > Algorithm Problems' 카테고리의 다른 글

<백준> 빗물(Gold 5)  (1) 2024.01.24
<백준> 동전 1(Gold 5)  (0) 2024.01.23
<프로그래머스> 미로 탈출(Lv.2)  (1) 2024.01.19
<백준> 치킨 배달(Gold 5)  (0) 2024.01.17
<백준> 하노이 탑 이동 순서(Gold 5)  (0) 2024.01.16