[Python] 프로그래머스 - 이진 변환 반복하기
Python으로 0 제거 횟수와 이진 변환 횟수를 계산하고, bin()을 활용한 더 간단한 풀이까지 정리한 글입니다.
For the English version of this post, see here.
[Python] 프로그래머스 - 이진 변환 반복하기
풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def solution(s):
answer = []
z_cnt = 0
cnt = 0
while True:
if len(s) == 1 and s[0] == '1':
break
z_cnt += s.count('0')
s = s.replace("0", "")
num = len(s)
arr = []
while num != 0:
arr.append(str(num%2))
num = num//2
arr.reverse()
s = ''.join(arr)
cnt += 1
answer.append(cnt)
answer.append(z_cnt)
return answer
- 처음에는 while 문 안에 이진 변환하는 부분의 while 문을
while num//2 != 0:이렇게 작성하였는데, 그렇게 되면 마지막에 1만 남을 때 1이 포함되지 못하고 조건에 걸려서 반복문이 종료됨- 따라서
num != 0으로 조건을 바꿈
- 따라서
- 또한, 처음에는 역정렬 할 때
arr.sort(reverse=True)로 작성하였는데, 그렇게 작성하면 그냥 큰 수부터 정렬이기 때문에 순서가 망가짐- 따라서
arr.reverse()를 통해 나머지가 거꾸로 쌓이도록 해줌
- 따라서
- 처음에는 만든 arr을 s에 대입하기 위해
s = arr을 사용해서 문자열이 아니라 리스트가 되도록 했기 때문에 오류가 생겼었음- 해결하기 위해
s = '',join(arr)을 통해서 문자열로 저장할 수 있도록 함
- 해결하기 위해
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def solution(s):
z_cnt = 0
cnt = 0
while s != "1":
z_cnt += s.count("0")
s = s.replace("0", "")
num = len(s)
s = bin(num)[2:]
cnt += 1
return [cnt, z_cnt]
위와 같은 방식으로도 작성 가능함
bin()함수숫자를 2진수(binary) 형태의 문자열로 바꿔주는 파이썬 함수ex)
bin(10)->'0b1010'으로 바꿔줌 (앞의0b는 2진수라는 표시)위 코드에서는 이진수 부분만 필요하기 때문에
bin(10)[2:]처럼 2진수라고 나타내주는 부분을 잘라냄