관리 메뉴

솜씨좋은장씨

[BaekJoon] 3460번 : 이진수 (Python) 본문

Programming/코딩 1일 1문제

[BaekJoon] 3460번 : 이진수 (Python)

솜씨좋은장씨 2022. 1. 14. 20:59
728x90
반응형

코딩 1일 1문제! 오늘의 문제는 백준의 3460번 이진수 입니다.

 

3460번: 이진수

양의 정수 n이 주어졌을 때, 이를 이진수로 나타냈을 때 1의 위치를 모두 찾는 프로그램을 작성하시오. 최하위 비트(least significant bit, lsb)의 위치는 0이다.

www.acmicpc.net

👨🏻‍💻 문제 풀이

10진수를 입력받으면 이를 이진수로 바꾼 뒤에 이진수 속에 있는 1의 위치출력하는 문제입니다.

먼저 예제 입력과 예제 출력을 확인해보면 13을 입력했을때 0 2 3 이라는 값이 나오는 것을 볼 수 있습니다.

 

13 을 이진수로 바꾸어보면 1011이 됩니다.

오른쪽 부터 1이 나오는 위치를 파악하고 첫 시작점의 위치를 0이라고 하면

13을 바꾼 이진수 1 0 1 1 
순서           3 2 1 0

0 2 3 이 되는겁니다.

 

이를 코드로 구현해보면 

N = int(input())

먼저 이진수로 바꿀 10진수를 하나 입력 받고

bin_N = list(bin(N)[2:][::-1])

Python의 내장함수인 bin을 활용하여 해당 정수를 이진수로 바꾸어줍니다.

그런데 bin을 활용하여 10진수를 이진수로 바꾸면

변환한 이진수 값 앞에 0b가 달라붙어 [2:] 를 활용하여 0b를 제외한 값만 남겨줍니다.

bin(13) -> 0b1101 -> bin(13)[2:] -> 1101

그 다음 1이 나오는 순서를 뒤에서 부터 찾으므로 이를 거꾸로 뒤집어 줍니다.

bin(13) -> 0b1101 -> bin(13)[2:] -> 1101 -> bin(13)[2:][::-1] -> 1011

뒤집을 때는 [::-1]을 활용하여 뒤집어 줍니다.

그 다음 해당 값을 list로 바꾸어줍니다.

num_idx = []

for idx, num in enumerate(bin_N):
    if num == '1':
        num_idx.append(str(idx))

그 다음 하나씩 값을 꺼내오는데 이때 위치 즉 idx 값을 알아야하므로 enumerate를 활용합니다.

꺼낸 값이 '1' 일때 만 num_idx 리스트에 담아준 뒤에

" ".join(num_idx)

위와 같이 리스트 속 값을 " " ( 공백 ) 을 기준으로 join 하여 문자열로 만든 값을 정답으로 합니다.

 

전체 코드는 아래를 참고해주세요.

👨🏻‍💻 코드 ( Solution )

def binary_one_position(N):
    num_idx = []
    
    bin_N = list(bin(N)[2:][::-1])
    
    for idx, num in enumerate(bin_N):
        if num == '1':
            num_idx.append(str(idx))
        
    return " ".join(num_idx)

if __name__ == "__main__":
    for _ in range(int(input())):
        n = int(input())
        print(binary_one_position(n))
 

GitHub - SOMJANG/CODINGTEST_PRACTICE: 1일 1문제 since 2020.02.07

1일 1문제 since 2020.02.07. Contribute to SOMJANG/CODINGTEST_PRACTICE development by creating an account on GitHub.

github.com

Comments