728x90
[깃허브]
[프로그래머스]
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 |