스터디/코딩테스트

python 코딩테스트 - 프로그래머스 이진 변환 반복하기

공대생철이 2023. 12. 4. 17:26
728x90

처음 든 생각

- 문제에 나온 그대로 차근차근 단계를 밟아나가자

(1) 0 제거

(2) 남은 1의 개수만큼 이진수로 변환

(3) (1)~(2) 과정 반복

- 0을 제거할 때 하나씩 count하면 될 거고

- 이진수 변환하는 건 혹시 라이브러리나 내장함수가 있을까? -> 아니면 재귀로 해서 풀어야된다

 

나의 답

def solution(s):
    zeros = 0
    count = 0
    tmp = 0
    
    while len(s) > 1:
        for i in s:
            if i == "0":
                zeros+=1
            else:
                tmp += 1
        s = format(tmp,'b')
        tmp = 0
        count += 1
    
    return [count , zeros]

 0의 개수, 이진변환 횟수, 1의 갯수를 담을 3개의 변수를 선언하였다.

 

반복문은 while로 구성했고 길이가 2 이상일 때는 무한 반복하도록 했다. 만약 길이가 1이라면 0 또는 1이기에 종료조건에 다다른 것이다.

 

문자열을 하나씩 탐색하며 0과 1의 개수를 세어주고 format을 활용하여 이진변환을 했다.

이 과정이 한 번 끝나면 count를 1 키워주고 다시 1의 개수는 초기화시켜준다.

 

🟧 format 파이썬 내장함수를 활용하여 진수 변환이 가능하다.

b = format(n,'b') #Binary format
o = format(n,'o') #Octal format
x = format(n,'x') #Hexadecimal format

 

format은 파이썬을 처음 공부할 때 문자열 내의 값 대입할 때 사용하는 것은 봤는데 진수 변환도 가능하다는 점은 이번에 처음 알게된 내용이다. 첫 번째 인자에 정수형 값, 두 번째 인자에 2진수, 8진수, 16진수를 가리키는 알파벳 1개 문자열을 대입하면 진수가 변환된다.

 

다른 사람의 답

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]

 

발상은 거의 같다. 

반복문의 조건이 "1"이 아닌 것으로 조금 더 디테일하게 조건을 설정하였다.

1의 개수를 세는 방식도 for 문이 아니라 count 메서드를 통해 세었다.

여기서는 이진수 변환은 bin이라는 내장함수를 통해서 진행하였다.

>>> bin(10)
'0b1010'

bin 함수의 결과값은 0b를 포함한 문자열로 나오므로 인덱스 슬라이싱을 통해서 앞에 2개는 제거해주는 형태로 이진수 변환을 진행하였다. 


format과 bin이라는 파이썬의 내장함수를 알게 되었다. 

파이썬은 진짜 유용한 내장함수가 개많은 것 같다.

728x90