문제
0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
- x의 모든 0을 제거합니다.
- x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.
0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- s의 길이는 1 이상 150,000 이하입니다.
- s에는 '1'이 최소 하나 이상 포함되어 있습니다.
입출력 예
풀이 방법
1. 주어진 s를 outZero에 복사한다. 복사하는 이유는 주어진 s는 value이기 때문에 값을 변경할 수 없다.
var outZero = s
2. 최종적으로 outZero가 1이 될 때까지 계속 반복해야하기 때문에 while문을 사용하고 조건도 아래와 같이 표현한다.
현재 outZero에 0이 포함되어 있으면 전부 제거해야하는데 제거하기 전에 0의 개수가 몇 개인지 알기 위해 count 함수 를 사용한다.
while(outZero != "1"){
zeroCnt += outZero.count{ it == '0'}
3. 0을 모두 제거한다.
outZero = outZero.replace("0", "")
4. 0을 제거한 outZero의 길이의 이진수를 구하기 위해 Integer.toBinaryString을 사용한다.
몇 번 반복하는지 구하기 위해 while문이 한 번 돌 때마다 cnt를 1씩 증가시킨다.
var len = outZero.length
outZero = Integer.toBinaryString(len).toString()
cnt++
5. 이진 변환의 횟수인 cnt와 변환 과정에서 제거된 0의 개수를 차례대로 answer에 추가한다.
answer += cnt
answer += zeroCnt
코드
class Solution {
fun solution(s: String): IntArray {
var answer: IntArray = intArrayOf()
var outZero = s
var zeroCnt = 0
var cnt = 0
while(outZero != "1"){
//0이 몇 개인지 체크
zeroCnt += outZero.count{ it == '0'}
//0 모두 제거
outZero = outZero.replace("0", "")
var len = outZero.length
//2진수로 바꾸기
outZero = Integer.toBinaryString(len).toString()
//몇 번 반복하는지 체크
cnt++
}
answer += cnt
answer += zeroCnt
return answer
}
}
기억하고 싶은 부분
Integer.toBinaryString(이진수로 변환하고 싶은 10진수)
위의 함수 아니었으면 직접 이진수를 구해 코드가 더 복잡해질 뻔 했는데 다행히 내장함수가 있어서 이진수로 바로 변환할 수 있다.
https://school.programmers.co.kr/learn/courses/30/lessons/70129
'Algorithm > kotlin' 카테고리의 다른 글
[프로그래머스/Kotlin] N개의 최소공배수 (Lv. 2) (0) | 2024.03.29 |
---|---|
[프로그래머스/Kotlin] 공원 산책 (Lv. 1) (2) | 2024.03.29 |
[프로그래머스/Kotlin] JadenCase 문자열 만들기 (Lv. 2) (0) | 2024.03.27 |
[프로그래머스/Kotlin] 구슬을 나누는 경우의 수 (Lv. 0) (0) | 2024.02.13 |
[프로그래머스/Kotlin] 공 던지기 (Lv. 0) (0) | 2024.02.13 |