[프로그래머스] 이진 변환 반복하기

kiki·2023년 12월 24일
0

프로그래머스

목록 보기
14/79

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/70129

문제 설명

수로 이루어진 문자열(s)에서 0을 제거한 후 길이를 이진수로 변환(=s)
-> 이 과정을 s가 1이 될 때까지 반복하고, 제거된 0의 총 갯수와 반복된 총 횟수를 반환

1차 시도

def solution(s):
    zero, cnt = 0,0
    while s!='1':
        cnt+=1
        l = len(s.replace("0",""))
        zero += len(s)-l
        tmp = ""
        while(l!=1):
            tmp+=str(l%2)
            l = l//2
        tmp+=str(l)
        s=tmp[::-1]
    return [cnt, zero]

while문 사용해 반복문 돌면서 반복 cnt 세고, 0 갯수 세고, 이진 변환하는 과정을 반복
이진수 구하는 과정에서 문자열을 거꾸로 뒤집기 위해 [::-1] 사용. 이걸 [-1:] 으로 착각했었음

2차 도전

def solution(s):
    zero, cnt = 0,0
    while s!='1':
        cnt+=1
        l = len(s.replace("0",""))
        zero += len(s)-l
        s = bin(l)[2:]
    return [cnt, zero]

bin이라는 이진 변환 함수가 있는 걸 이 나이 되도록 몰랐다니. 사실 모르기보단 까먹었을 것
bin()은 10진수를 2진수로 변환해주는 함수로 0b1001과 같은 식으로 반환하기 때문에 앞 2문자를 자르고 사용해야함 그러기때문에 bin(l)[2:]로 이진수 구해야함
여기서 0을 replace 하고 길이를 구해도 되지만 그냥 1을 카운트 해서 사용했어도 됨 -> 생각의 전환

정리

  • bin 함수를 사용해 10진수를 2진수로 변환할 수 있다. 0b1001과 같이 반환되므로 [2:] 필요
  • 문자열을 거꾸로 뒤집기 위해서는 str[::-1]과 같이 사용할 수 있음. 리스트에도 동일하게 적용 가능

참고

10진수 -> 2진수 변환 방법

bin = ""
while(dec!=1):
    bin = str(dec%2) + bin
    dec = dec//2
bin = str(dec) + bin

아래와 같이 이진수 구하는 방법을 코드로 구현해봄

2 | 29 - 1
    ㅡ
  | 14 - 0
    ㅡ
  | 7  - 0
    ㅡ
  | 3  - 1
    ㅡ
  | 1  - 1
  
29 -> 111001

0개의 댓글