[문제 링크] 👇
풀이 방법
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') -> 중복된 요소가 있어도 하나만 제거됨
'프로그래머스 코딩테스트 > Level 2' 카테고리의 다른 글
[Programmers] L2. 짝지어 제거하기 (Python) (0) | 2024.11.11 |
---|---|
[Programmers] L2. 피보나치 수 (Python) (0) | 2024.11.10 |
[Programmers] L2. JadenCase 문자열 만들기 (Python) (0) | 2024.11.08 |
[Programmers] L2. 최솟값 만들기 (Python) (0) | 2024.11.08 |
[Programmers] L2. 올바른 괄호 (스택/큐/Python) (0) | 2024.11.08 |