ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 백준 3,460 : 이진수
    코딩테스트/백준 2024. 6. 6. 12:05

    [문제 풀기 전 생각한 부분]

    1. 몇 번 반복할지 모르니깐 while문을 사용하자. 

    2. 나머지를 저장할 공간을 만들고 출력해야지.

    [my_code]

    # 13      16 8 4 2 1 0
    #          0 1 1 0 1        -> 0 2 3 
    # 13 / 2 = 6 , 13 % 2 == 1
    # 6 / 2 = 3  , 6 %  2 == 0
    # 3 / 2 = 1  , 3 % 2 == 1
    # 1 / 2 = 0 ,   1 % 2 == 1
    
    # 몫을 구하고 나머지를 구할 때 마다 append를 해주면 1101 순서대로 들어갈것.
    # 리스트.find(1), end=' ' <- 공백을 어떻게 표현하냐.
    
    T = int(input())
    num = int(input())
    
    bi = []
    
    while True:
        if num / 2 == 0:
            bi.append(num%2)
            break
        else:
            a = num / 2   # 13 / 2 = 6
            b = num % 2   # 13 % 2 = 1
            bi.append(b)


    [문제점]

    • 무한 루프 발생 가능성:
      • while True 루프는 num이 0이 되지 않으면 무한히 반복될 수 있습니다.
      • num이 0이 되지 않도록 num 값을 갱신하는 부분이 누락되었습니다.
    • 잘못된 조건:
      • if num / 2 == 0: 조건은 잘못되었습니다. num이 0이 아닐 때도 num / 2가 0이 될 수 있습니다.
    • 정수 나눗셈 사용 필요:
      • a = num / 2는 소수점을 포함한 나눗셈입니다. 정수 나눗셈인 //를 사용해야 합니다.
      • a 변수는 불필요합니다. 바로 num을 갱신하면 됩니다.
    • 리스트 순서:
      • 이진수는 역순으로 저장됩니다. 따라서 나중에 리스트를 뒤집어야 합니다.

    [문제점 해결]

    T = int(input())
    
    for _ in range(T):
        num = int(input())
    
        bi = []
    
        while num > 0:
            bi.append(num%2)
            num //=2
    
        # bi.reverse()
        for i in range(len(bi)):
            if bi[i]==1:
                print(i, end=' ')
        print()

     

     

    [다른 방법으로 풀어보기]

    T = int(input())
    for _ in range(T):
        num = int(input())
        bi = []
    
        while num > 0:
            bi.append(num % 2)
            num //= 2
    
        positions = [index for index, value in enumerate(bi) if value == 1]
    
        for pos in positions:
            print(pos, end=' ')
        print()  # 줄바꿈

    리스트 컴프리헨션

    리스트 컴프리헨션은 기존 리스트를 기반으로 새로운 리스트를 생성하는 간결하고 효율적인 방법입니다. 구문은 다음과 같습니다:

    [new_element for element in iterable if condition]

    여기서, new_element는 새로운 리스트에 추가할 요소이고, element는 iterable의 각 요소를 나타내며, if condition은 선택적으로 포함되는 조건입니다.

    enumerate 함수

    enumerate 함수는 순회 가능한 객체(리스트 등)를 입력받아 인덱스와 요소를 튜플로 반환하는 함수입니다. 예를 들어:

    list(enumerate(['a', 'b', 'c'])) # [(0, 'a'), (1, 'b'), (2, 'c')]

    enumerate를 사용하면 인덱스와 값을 동시에 얻을 수 있습니다.

    구문 해석

    이제 구문을 해석해 보겠습니다:

    positions = [index for index, value in enumerate(bi) if value == 1]

    이 구문은 bi 리스트에서 value가 1인 요소의 index를 찾아 positions 리스트에 추가합니다.

    단계별 동작

    1. bi 리스트를 enumerate 함수로 순회합니다. enumerate(bi)는 (index, value) 쌍의 튜플을 반환합니다.
    2. 각 (index, value) 쌍에 대해 value가 1인지 확인합니다 (if value == 1).
    3. value가 1이면 index를 positions 리스트에 추가합니다.

    예시

    bi = [1, 1, 0, 1]인 경우를 예로 들어 설명해 보겠습니다.

    bi = [1, 1, 0, 1] positions = [index for index, value in enumerate(bi) if value == 1]
    1. enumerate(bi)는 [(0, 1), (1, 1), (2, 0), (3, 1)]을 반환합니다.
    2. 리스트 컴프리헨션이 각 (index, value) 쌍을 순회합니다.
      • 첫 번째 쌍 (0, 1)에서 value는 1이므로 index 0을 positions에 추가합니다.
      • 두 번째 쌍 (1, 1)에서 value는 1이므로 index 1을 positions에 추가합니다.
      • 세 번째 쌍 (2, 0)에서 value는 0이므로 index를 추가하지 않습니다.
      • 네 번째 쌍 (3, 1)에서 value는 1이므로 index 3을 positions에 추가합니다.
    3. 최종적으로 positions 리스트는 [0, 1, 3]이 됩니다.
Designed by Tistory.