Programmers, 이진 변환 반복하기
TL;DR
- 문자열(string)
- 구현(implementation)
문제 요약
1. 0과 1으로 이루어진 문자열에 대해 다음과 같은 이진 변환을 s가 1이 될 때까지 반복한다.
1-1. x의 모든 0을 제거한다.
1-2. 0이 제거된 x의 길이를 c라고 한다면 x를 c를 2진법으로 표현한 문자열로 바꾼다.
2. s가 1이 될때까지 반복된 이진 변환 횟수와 제거된 0의 개수를 반환한다.
- 주어진 문자열이 1이 될 때까지 문제에서 요구하는 조건을 반복실행한 결과를 반환하면 된다.
- 숫자를 2진법으로 바꾸는 `bin()` 메소드를 사용하여 문제를 풀 수 있다.
입출력 형태
예시 1 :: 예시 1의 문제를 문제에서 주어진 조건으로 해결하면 아래와 같다.
1. 0을 제거한다. "111111"
2. 0을 제거한 문자열의 길이 6을 이진법으로 바꾼 숫자를 x로 둔다. "110"
3. "110"에서 0을 제거한다. "11"
4. "11"의 길이인 2를 이진법으로 바꾼 숫자를 x로 둔다. "10"
5. "10"에서 0을 제거한다. "1"
6. "1"의 길이인 1을 이진법으로 바꾼 숫자를 x로 둔다. "1". x가 "1"이므로 반복을 종료한다.
이렇게 되면 총 3번의 이진변환(1~2, 3~4, 5~6)이 이루어졌고, 총 8개의 0이 각 단계에서 제거되었기 때문에 [3, 8]을 반환한다.
풀이
def solution(s):
count, zero_count = 0, 0
while s != '1':
count += 1
zero_count += s.count('0')
# 0 제거 후 제거된 길이를 2진법으로 표현
s = bin(len(s.replace('0', '')))[2:]
return [count, zero_count]
이진 변환의 횟수와 제거한 0의 개수를 저장할 변수 counts와 zero_count를 선언한다.
s가 '1'이 될 때까지 이진변환을 반복 수행한다.
이진 변환이 수행될 때마다 횟수인 counts를 1 증가시킨다.
문자열이 갖고 있는 0의 수를 세서 zero_count를 증가시킨다.
s에서 0을 제거하고 제거한 문자열의 길이를 이진법 수로 변환한 뒤 해당 문자열을 문자열 s로 치환한다.
- 이 때, [2:]를 하는 이유는 이진법으로 변환된 수의 앞에 "0b"가 붙기 때문에 이를 제거해주기 위해서이다.
이진 변환이 종료되면 수행된 이진 변환의 수와 제거된 0의 개수를 얻을 수 있다.
'개발 > Algorithm' 카테고리의 다른 글
[프로그래머스] 튜플(python) (0) | 2021.10.10 |
---|---|
[프로그래머스] 카펫(python) (0) | 2021.10.04 |
[프로그래머스] 파일명 정렬(python) (0) | 2021.09.29 |
[프로그래머스] 전화번호 목록(python) (0) | 2021.09.27 |
[프로그래머스] 가장 큰 수(python) (0) | 2021.09.27 |