본문 바로가기
알고리즘 문제 풀이/프로그래머스

프로그래머스 이진 변환 반복하기 Kotlin (문자열)

by 옹구스투스 2022. 6. 15.
반응형

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/70129

 

코딩테스트 연습 - 이진 변환 반복하기

 

programmers.co.kr

이진 변환 반복하기

문제 설명

0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.

  1. x의 모든 0을 제거합니다.
  2. 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
    }
}

반응형

댓글