반응형
문제
양의 정수 n이 주어졌을 때, 이를 이진수로 나타냈을 때 1의 위치를 모두 찾는 프로그램을 작성하시오. 최하위 비트(least significant bit, lsb)의 위치는 0이다.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, n이 주어진다. (1 ≤ T ≤ 10, 1 ≤ n ≤ 106)
출력
각 테스트 케이스에 대해서, 1의 위치를 공백으로 구분해서 줄 하나에 출력한다. 위치가 낮은 것부터 출력한다.
예제 입력 | 예제 출력 |
1 13 |
0 2 3 |
정답
# 나의 풀이
T = int(input())
while T > 0:
num = int(input())
results = []
cnt = 0
while num > 0:
if num % 2 == 1:
results.append(cnt)
num //= 2
cnt += 1
print(' '.join(map(str, results)))
T -= 1
# 다른 사람의 풀이
T = int(input())
for _ in range(T):
n = bin(int(input()))[2:]
for i in range(len(n)):
if n[-i-1] == '1':
print(i, end = " ")
Tip
다른 사람의 풀이가 매우 심플해서 처음 보는 것들을 파헤져보자.
n = bin(int(input()))[2:]
bin 함수는 10진수를 2진수로 바꿔주는 함수이다.
예를 들어 0b1101 이런 형식으로 오게 되는데 0b를 제외하고 뒤에 1101 숫자만 사용하기 위해서 [2:]를 뒤에 붙혀준다.
[2:]는 2번째 문자열 ~ 끝 문자열까지 잘라서 보여준다는 뜻이다.
if n[-i - 1] == '1':
2진수의 값을 역순을 봐야 하기 때문에 [-i -1]를 사용하여 역순으로 한 문자열씩 보기 시작한다.
# n: 1101
print(n[-1]) # 1
print(n[-2]) # 0
print(n[-3]) # 1
print(n[-4]) # 1
-i - 1를 한 이유가 이러한 이유이다.
print(i, end=' ') # 0 2 3
end는 문자를 출력하고 마지막에 무엇을 출력해줄지를 정해준다.
나는 ' ' 공백을 두었기 때문에 0 2 3이 각각 공백을 가지게 된다.
만약 end에서 Syntax 에러가 뜬다면 python2가 python3의 문법을 사용할라고 해서 그런 것이다.
from __future__ import print_function
추가해서 print 관련 python3 문법을 사용 가능하게 해주자.
반응형
'Python 알고리즘' 카테고리의 다른 글
[Python] 백준 10870 피보나치 수 5 (0) | 2021.09.29 |
---|---|
[Python] 백준 2460번 지능형 기차 2 (0) | 2021.09.28 |
[Python] 백준 10818번 최소, 최대 (0) | 2021.09.27 |
[Python] 백준 2501 N번째 약수 구하기 (0) | 2021.09.23 |
[Python] 백준 1271 엄청난 부자2 (0) | 2021.09.22 |