Stay Hungry Stay Foolish

프로그래머스 코딩테스트/Level 2

[Programmers] L2. 이진 변환 반복하기 (Python)

dev스카이 2024. 11. 9. 14:17

[문제 링크] 👇

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


풀이 방법

2진법 변환 방법

 

1️⃣ format 함수 이용

n = 5
binary_str = format(n, 'b')  # 결과: '101'

 

2️⃣ bin() 함수 사용

n = 5
binary_str = bin(n)  # 결과: '0b101'

 

3️⃣ f-string을 사용한 포맷팅

n = 5
binary_str = f"{n:b}"  # 결과: '101'

 

Solution

def solution(s):
    zero, num, cnt = 0, 0, 0  # 0의 개수, 2진법 길이, 변환 횟수

    while True:
        cnt += 1  # 변환 횟수 증가
        for i in s:  
            if i == '1':  # 1 이면 길이 카운트
                num += 1
            else:  # 0 이면 0 개수 카운트
                zero += 1
        if num == 1:  # 1이 될 때 종료
            break
        else:  
            s = format(num, 'b')  # 2진수로 변환해서 다시 담기
            num = 0  # 초기화

    return [cnt, zero]

 

 

개선할 점

이 코드에서 불필요하게 변수 num을 초기화하고 다시 for 루프에서 1의 개수를 계산하고 있는데, Python의 count 메서드를 이용해 0과 1의 개수를 더 효율적으로 세면 성능이 개선된다. 또, 조건을 num == 1로 체크하는 대신 문자열 길이가 1인지 체크하는 것도 명확하다. 다음과 같이 개선할 수 있다.

 

개선된 코드

def solution(s):
    zero, cnt = 0, 0  # 0의 개수, 변환 횟수

    while s != '1':
        cnt += 1
        zero += s.count('0')  # 0의 개수 추가
        s = bin(len(s.replace('0', '')))[2:]  # 0을 제거한 길이를 이진수로 변환

    return [cnt, zero]

👩‍💻 회고

2진법으로 변환하는 방법만 알면 쉽게 풀 수 있을 문제였다. 다만 성능이 효율적이지 못한 코드를 작성한 점이 아쉽다. 순수 구현도 좋지만 내장 함수를 적극 활용하도록 하자.

 

remove() 사용 시 주의사항

  • s = "110010101001" -> s.remove("0") 사용 불가
    • AttributeError: 'str' object has no attribute 'remove'
  • answer.remove('0') -> 중복된 요소가 있어도 하나만 제거됨