문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/70129
이진 변환 반복하기
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'이 최소 하나 이상 포함되어 있습니다.
풀이
언젠지 모를 이전에 풀었던 문제인데, 코드를 보면 확실히 성장한 게 느껴진다.
그래도 코틀린으로 풀었던 걸 보면 길어야 반년 정도일 텐데 기간에 비해 큰 성장은 아니지만 그래도 뿌듯하다.
두 코드의 비교는 아래 코드와 결과를 보면 된다.
코드2는 +등의 연산이 자주 사용되는 문자열엔 String이 아니라 StringBuilder를 사용해 줘야 하는데 이전 코드에선 그냥 String을 사용했다. 코드1은 코틀린에서 지원하는 함수를 적극 활용하는 멋진 모습~!
사용한 핵심 함수는 count, apply, Integer.toBinaryString 깔끔~
이게 s의 길이가 15만이라서 효율성도 고려를 해야 할까? 할 수 있는데, x의 길이를 2진법으로 바꾸는 과정에서 길이가 확 줄어들기 때문에 효율성은 고려하지 않아도 통과하는 문제이다.
실제로 s에 1을 15만 개 넣으면 그다음은 100100100111110000, 그다음은 1000 그다음은 1로 3번 만에 끝난다.
100100100111110000
1000
[3, 13]
코드1
class Solution {
fun solution(s: String): IntArray {
val answer = intArrayOf(0,0)
var str = s
while(str!="1"){
answer[0]++
str.count{it=='0'}.apply {
answer[1]+=this
//1의 길이
str = Integer.toBinaryString(str.length - this)
}
}
return answer
}
}
코드2
class Solution {
fun solution(s: String): IntArray {
var str =s.replace("0","")
var count=0
var ans=s.length-str.length
while(str.length!=1){
var num =str.length
var temp=""
while(num!=0){
temp=(num%2).toString()+temp
num/=2
}
count++
str=temp.replace("0","")
ans+=temp.length-str.length
}
var answer: IntArray = intArrayOf(++count,ans)
return answer
}
}
'알고리즘 문제 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스 스타 수열 Kotlin (그리디) (0) | 2022.06.24 |
---|---|
프로그래머스 모음사전 c++, Kotlin (순열) (0) | 2022.06.21 |
2022 카카오 블라인드 사라지는 발판 Kotlin (완전 탐색) (0) | 2022.06.02 |
프로그래머스 파괴되지 않은 건물 Kotlin (누적 합) (0) | 2022.05.27 |
프로그래머스 징검다리 Kotlin (이분탐색) (0) | 2022.05.25 |
댓글