Lesson 1 - Iterations : BinaryGap
kotlin
이진수 변환 직접 구현
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| import kotlin.math.max
fun solution(N: Int): Int { var answer = 0 var temp = "" var quotient = N var remainder: Int
while (quotient >= 1) { remainder = quotient % 2 quotient /= 2 temp += remainder.toString() }
val binary = temp.reversed() val oneIndexList = mutableListOf<Int>()
binary.forEachIndexed { index, c -> if (c == '1') { oneIndexList.add(index) } } var gap: Int
for (i in 0 until oneIndexList.size - 1) { gap = oneIndexList[i+1] - oneIndexList[i] - 1 answer = max(gap, answer) }
return answer }
|
- 이진수 변환을 직접 구현
- 이진수 문자열에서
1
이 위치한 인덱스들을 값으로 가지는 리스트 생성
1
이 위치한 인접한 인덱스끼리 빼고, 추가적으로 1을 더 빼면 gap의 크기가 나옴
Int.toString(radix: Int)
사용하여 이진수 변환
1 2 3 4 5 6 7 8 9 10 11
| fun solution(N: Int): Int { val binary = N.toString(2)
val zeroList = binary.split("1").toMutableList()
if (binary.last() != '1') { zeroList.removeAt(zeroList.size - 1) }
return zeroList.map { it.length }.max() ?: 0 }
|
Int.toString(radix: Int)
사용하여 이진수 변환을 매우 간단하게 할 수 있다.
1
을 구분자 delimniter로 이진수 문자열을 split 하여 연결된 0
들을 값으로 가진 리스트를 생성
- 만약 이진수의 끝자리가
1
이 아닐 경우엔 마지막 연결된 0
들은 gap으로 인정되지 않으므로 리스트에서 삭제한다.
Iterable<T>.map(transform: (T) -> R)
을 통해 리스트 원소의 길이를 기준으로 리스트를 생성한 후 가장 큰 값을 max()
를 이용해 리턴한다.
대부분의 코딩 사이트는 kotlin 1.4를 지원하지 않는데 1.4 기준으로는 아래처럼 사용해야하거나 사용할 수 있다.
removeAt(zeroList.size - 1)
-> zeroList.removeLast()
max()
-> maxOrNull()