문제
코드
fun solution(N: Int): Int {
var n = N
val binary = StringBuffer()
val sequenceList = mutableListOf<Int>()
while (n != 0) {
binary.append("${n % 2}")
n /= 2
}
binary.reverse()
// println(binary.reverse())
var count = 0
for (i in binary.indices) {
if (binary[i] == '1') {
if (count > 0) sequenceList.add(count)
// println("list: $sequenceList")
count = 0
} else {
count++
}
}
// println(sequenceList.maxOrNull() ?: 0)
return sequenceList.maxOrNull() ?: 0
}
풀이
코딜리티에서 처음 문제를 풀어봤는데, 영어로 문제가 나오더라
좀 당황했지만 천천히 읽으면 문제가 이해가 안 되지는 않음..ㅎㅎ
클래스의 생성자로 들어온 숫자를 이진수로 변환해서 0이 연속해서 나오는 시퀀스의 최장 길이를 구하라는 내용이었다.
단, 해당 시퀀스는 처음과 끝이 1로 이루어져 있어야 한다는 점이 중요 포인트다.
이진수를 구하는 법은 나머지를 계속해서 붙이면 된다.
근데 append를 사용하면 2의 0승 자리가 맨 앞에 오게 되기 때문에, reverse를 해줬다.
그 다음 0이 연속해서 나오는 시퀀스를 구하면 된다
처음에 이 부분을 어떻게 구현해야할지 감이 안잡혀서 enable 변수를 하나 두고 1이 나올 때 true로 뒀다가, 다음 1이 나오면 false로 두고 false일 때 count를 리스트에 저장하면 될 것 같았다.
근데 10010001 이런식의 이진수는 중간에 있는 1이 앞의 길이 2 시퀀스의 끝이자 길이 3 시퀀스의 처음을 맡기 때문에 이런 식으로 구현하면 뒤의 시퀀스를 제대로 파악하지 못하게 된다.
그래서 enable을 지우고 그냥 count가 0이 아닌 경우만 확인해서 리스트에 추가하도록 했다.
이렇게 하면 10010001의 경우에도 2와 3이 리스트에 제대로 들어가게 된다.
return 값은 리스트의 max 값을 출력하지만, 문제에서 답이 없는 경우엔 0을 출력하라 했기 때문에
maxOrNull()과 엘비스 연산자를 이용해서 null 처리를 해줬다.
* maxOrNull()은 리스트에 요소가 하나도 없으면 null을 리턴
처음이라 좀 당황했지만, 나름대로 잘 해결한 것 같다. 시간을 좀 더 줄여보도록 하자!
'Algorithm > 💼Codility' 카테고리의 다른 글
[Lesson 2] OddOccurrencesInArray (0) | 2024.07.28 |
---|---|
[Lesson 2] CyclicRotation (0) | 2024.07.27 |
댓글