문제
https://school.programmers.co.kr/learn/courses/30/lessons/70129
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
x의 모든 0을 제거합니다.
x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.
0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
s의 길이는 1 이상 150,000 이하입니다.
s에는 '1'이 최소 하나 이상 포함되어 있습니다.
입출력 예
s result
"110010101001" [3,8]
"01110" [3,3]
"1111111" [4,1]
입출력 예 설명
입출력 예 #1
"110010101001"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 이진 변환 이전 제거할 0의 개수 0 제거 후 길이 이진 변환 결과
1 "110010101001" 6 6 "110"
2 "110" 1 2 "10"
3 "10" 1 1 "1"
3번의 이진 변환을 하는 동안 8개의 0을 제거했으므로, [3,8]을 return 해야 합니다.
코드
def solution(s):
answer = []
cnt = 0
zero_cnt = 0 # 변환 과정에서 제거된 모든 0의 개수
while True:
if s == '1':
break
zero_cnt += s.count('0')
s = s.replace('0', '')
cnt += 1
# s를 "len(s)를 2진법으로 표현한 문자열"로 바꾸기
s = bin(int(len(s)))[2:]
answer = [cnt, zero_cnt]
return answer
설명
알고리즘 생각은 성공!
근데 이진법 변환이 쉬웠는데 생각하질 못했다.
- 10진수 → 2, 8, 16진수
2, 8, 16진수는 bin(), oct(), hex() 함수를 지원함
* 아래 결과는 모두 string 입니다.
print(bin(10))
print(oct(10))
print(hex(10))
0b1010
0o12
0xa
0b는 2진수, 0o는 8진수, 0x는 16진수를 의미합니다. 앞의 진법 표시를 지울려면 [2:]를 하면 됩니다.
print(bin(10)[2:])
print(oct(10)[2:])
print(hex(10)[2:])
1010
12
a
'Coding Test > Python' 카테고리의 다른 글
| [프로그래머스] 피보나치 수 (0) | 2023.06.07 |
|---|---|
| [프로그래머스] 숫자의 표현 (1) | 2023.06.07 |
| [프로그래머스] 최솟값 만들기 (0) | 2023.06.06 |
| [Python] 프로그래머스 - 최댓값과 최솟값 (0) | 2023.06.06 |
| [Python] 코딩테스트 준비 직전 확인 사항들 (2) | 2023.05.14 |