NIRVANA

[level 2] 이진 변환 반복 본문

Coding test(Python3)/Programmers

[level 2] 이진 변환 반복

녜잉 2023. 9. 28. 17:31

문제

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 함수를 완성해주세요.

 

 

문제 풀이 접근법1

1) count_change(이진변환 수), count_remove(0 삭제 개수), c(처음 s의 길이)를 정의한다.

2) c의 길이만큼 반복문을 돌린다.

3) s에서 0의 개수를 count로 구한 다음, replace함수를 사용하여 0을 ' '로 바꿔 문자열에서 삭제한다.

4) format함수를 사용하여 s의 길이(10진수)를 2진수로 변환한다. 이때, count_chage에 +1을 한다. 

5) 만약 s 안에 0이 없고, s의 길이가 1이면 반복문을 탈출한다. 

def solution(s):
    count_change = 0
    count_remove = 0

    c = len(s)

    for i in range(c):

        count_remove += s.count('0')
        s = s.replace('0', '')

        s = format(len(s), 'b')
        count_change+=1

        if '0' not in  s and len(s) == 1:
            break 
            
    return [count_change, count_remove]

 

원래는 while True로 무한 반복 할려고 했는데

너무 시간이 오래 걸려서 일단 처음 s 길이만큼 for문 돌리고 조건을 만족하면 탈출하는 걸로 했다.

 

 

 


 

다른 분들 풀이

def solution(s):
    a, b = 0, 0
    while s != '1':
        a += 1
        num = s.count('1')
        b += len(s) - num
        s = bin(num)[2:]
    return [a, b]

a는 이진변환을 한 수, b는 삭제한 0의 개수이다. 

그다음에 s = bin(num)[2:]는 s에서 0을 삭제한 다음의 s의 길이(==1만 있으므로)를 bin함수로 2진변환한 후, 앞에 문자열을 빼기 위해 슬라이싱 해준 것!

 

와...이렇게도 할 수 있네...

원래 s의 길이에서 1의 개수를 빼면 0의 개수가 나오는거...생각도 못했다. 

 

 

참고: https://minnit-develop.tistory.com/17

 

[Algorithm/Python] 파이썬 2진수 변환 다양한 풀이 (Convert decimal to binary in python)

문제 양의 정수 n이 주어졌을 때, 이를 이진수로 변환하기 풀이 2진수 변환 함수 사용 ⭕️ binaryNum = format(n, 'b') return binaryNum format 이라는 함수를 이용한다. 'b' 는 2진수를 뜻한다. binaryNum = bin(n) re

minnit-develop.tistory.com

이진수 변환!!!

format(변환숫자, 'b')  외우자(제발)