-
[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 리스트에 추가합니다.
단계별 동작
- bi 리스트를 enumerate 함수로 순회합니다. enumerate(bi)는 (index, value) 쌍의 튜플을 반환합니다.
- 각 (index, value) 쌍에 대해 value가 1인지 확인합니다 (if value == 1).
- 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]
- enumerate(bi)는 [(0, 1), (1, 1), (2, 0), (3, 1)]을 반환합니다.
- 리스트 컴프리헨션이 각 (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에 추가합니다.
- 최종적으로 positions 리스트는 [0, 1, 3]이 됩니다.
'코딩테스트 > 백준' 카테고리의 다른 글
[Python] BOJ 9020 : 골드바흐의 추측 (1) 2024.09.08 [Python] 백준 10,818 : 최소, 최대 (0) 2024.06.19 [Python] 백준 : 1차원 배열 (3) 2024.03.18 [Python] 백준 : 조건문 모음집 (두 수 비교하기 이후부터) (1) 2024.01.27 [Python] 백준 : 반복문 모음집 (1) 2024.01.27 - 무한 루프 발생 가능성: