문제 65
문제
리스트 [2,4,6,8]의 모든 숫자가 짝수인지 확인하는 assert 문을 작성하십시오.
힌트
단언문을 만들려면 “assert 표현식“을 사용하십시오.
주요 저자 솔루션: 파이썬 2
li = [2,4,6,8]
for i in li:
assert i%2==0 # i를 2로 나눈 나머지가 0인지 확인합니다. 0이 아니면 AssertionError 발생
내 솔루션: 파이썬 3
data = [2,4,5,6] # 리스트에 홀수 5를 포함하여 assert가 실패하도록 함
for i in data:
assert i%2 == 0, "{}는 짝수가 아닙니다".format(i) # 조건이 거짓이면 메시지와 함께 AssertionError 발생
문제 66
문제
콘솔에서 기본 수학 표현식을 입력받아 평가 결과를 인쇄하는 프로그램을 작성하십시오.
예시: 다음 n이 프로그램에 입력으로 주어지면: (주: n이 아니라 표현식)
35 + 3
그러면 프로그램의 출력은 다음과 같아야 합니다:
38
힌트
표현식을 평가하려면 eval()을 사용하십시오. (주의: eval()은 안전하지 않은 입력을 평가할 수 있으므로 신뢰할 수 없는 소스의 입력에는 사용하지 않는 것이 좋습니다.)
주요 저자 솔루션: 파이썬 2
expression = raw_input() # 사용자로부터 표현식 입력
print eval(expression) # 표현식 평가 및 결과 출력
내 솔루션: 파이썬 3
expression = input()
ans = eval(expression)
print(ans)
문제 67
문제
정렬된 리스트에서 항목을 검색하는 이진 검색 함수를 작성하십시오. 함수는 리스트에서 검색할 요소의 인덱스를 반환해야 합니다.
힌트
조건을 처리하려면 if/elif를 사용하십시오.
주요 저자 솔루션: 파이썬 2
import math
def bin_search(li, element):
bottom = 0
top = len(li)-1
index = -1 # 요소를 찾지 못한 경우 -1 반환
while top>=bottom and index==-1: # 검색 범위가 유효하고 아직 찾지 못했다면 반복
mid = int(math.floor((top+bottom)/2.0)) # 중간 인덱스 계산 (내림)
if li[mid]==element: # 중간 요소가 찾는 요소와 같으면
index = mid # 인덱스 저장
elif li[mid]>element: # 중간 요소가 더 크면
top = mid-1 # 검색 범위를 왼쪽 절반으로 줄임
else: # 중간 요소가 더 작으면
bottom = mid+1 # 검색 범위를 오른쪽 절반으로 줄임
return index
li=[2,5,7,9,11,17,222]
print bin_search(li,11) # 11 검색 (결과: 4)
print bin_search(li,12) # 12 검색 (결과: -1)
내 솔루션: 파이썬 3
# 작성 예정 (아래 다른 사람들의 솔루션 참고)
ulmasovjafarbek 솔루션: 파이썬 3
def binary_search(lst, item):
low = 0
high = len(lst) - 1
while low <= high: # low가 high보다 작거나 같을 동안 반복
mid = round((low + high) / 2) # 중간 인덱스 (반올림, Python 3에서는 // (정수 나누기)가 더 일반적)
# mid = (low + high) // 2 로 수정하는 것이 좋음
if lst[mid] == item: # 찾았으면 인덱스 반환
return mid
elif lst[mid] > item: # 찾는 값이 더 작으면 high를 줄임
high = mid - 1
else: # 찾는 값이 더 크면 low를 늘림
low = mid + 1
return None # 찾지 못하면 None 반환
lst = [1,3,5,7,]
print(binary_search(lst, 9)) # 9는 리스트에 없으므로 None 출력
AasaiAlangaram 솔루션: 파이썬 3 (이진 검색 변형)
def binary_search_Ascending(array, target): # 오름차순 정렬된 배열 대상
lower = 0
upper = len(array) # upper를 len(array) - 1이 아닌 len(array)로 설정
print('배열 길이:',upper)
while lower < upper: # lower가 upper보다 작을 동안 반복 (일반적으로는 lower <= upper)
x = (lower + upper) // 2 # 중간 인덱스
print('중간 값 인덱스:',x) # 'Middle Value'를 '중간 값 인덱스'로 번역
value = array[x]
if target == value:
return x
elif target > value:
lower = x + 1 # target이 더 크면 lower를 x + 1로 (AasaiAlangaram 솔루션에서는 lower = x)
# 일반적인 이진 검색에서는 검색 범위를 확실히 줄이기 위해 x + 1 또는 x - 1 사용
elif target < value:
upper = x # target이 더 작으면 upper를 x로 (AasaiAlangaram 솔루션에서는 upper = x)
# 일반적인 이진 검색에서는 upper = x - 1
# 현재 로직은 특정 상황에서 무한 루프나 잘못된 결과를 초래할 수 있음.
# 예를 들어 target이 value보다 클 때 lower = x로 설정하면, x가 계속 같은 값일 경우 무한 루프 가능성.
# 표준 이진 검색 로직을 따르는 것이 좋음.
Array = [1,5,8,10,12,13,55,66,73,78,82,85,88,99]
print('값을 찾은 인덱스:',binary_search_Ascending(Array, 82)) # 'The Value Found at Index:'를 번역
참고: AasaiAlangaram의 솔루션은 표준 이진 검색과 약간 다른 업데이트 로직(lower = x, upper = x)을 사용하고 있어, 특정 케이스에서 문제가 발생할 수 있습니다. 표준적인 방식은 lower = mid + 1과 upper = mid - 1을 사용하는 것입니다.
yuan1z 솔루션: 파이썬 3 (재귀적 이진 검색)
idx = 0 # 전역 변수 idx를 사용하여 최종 인덱스 추적 (재귀 호출 시 인덱스 보정용)
def bs(num,num_list):
global idx # 전역 변수 idx 사용 선언
if (len(num_list) == 1): # 리스트에 요소가 하나만 남았을 때
if num_list[0] == num: # 그 요소가 찾는 숫자이면
return idx # 현재까지 누적된 idx 반환
else: # 아니면
return "리스트에 없음" # "No exit in the list"를 번역
elif num_list[len(num_list)//2 -1] >= num : # 찾는 숫자가 왼쪽 절반의 마지막 요소보다 작거나 같으면 (num in num_list[:len(num_list)//2] 와 유사한 로직)
# (수정 제안: num <= num_list[len(num_list)//2 -1] 또는 num < num_list[len(num_list)//2] )
return bs(num,num_list[:len(num_list)//2]) # 왼쪽 절반으로 재귀 호출
else: # 찾는 숫자가 오른쪽 절반에 있다면
idx += len(num_list)//2 # 오른쪽 절반으로 이동했으므로 idx에 왼쪽 절반의 길이를 더함
return bs(num,num_list[len(num_list)//2:]) # 오른쪽 절반으로 재귀 호출
print(bs(66,[1,5,8,10,12,13,55,66,73,78,82,85,88,99,100]))
참고: yuan1z의 솔루션은 전역 변수를 사용하여 인덱스를 관리하며, 재귀적으로 리스트를 슬라이싱합니다. 리스트 슬라이싱은 새 리스트를 생성하므로 매우 큰 리스트에서는 비효율적일 수 있습니다. 인덱스를 직접 전달하는 방식이 더 효율적입니다. 조건 num_list[len(num_list)//2 -1] >= num 부분도 주의 깊게 검토 필요.
문제 68
문제
파이썬 모듈을 사용하여 10과 100 사이의 임의의 부동 소수점 숫자를 생성하십시오.
힌트
random.random()을 사용하여 [0,1] 범위의 임의의 부동 소수점 숫자를 생성하십시오.
주요 저자 솔루션: 파이썬 2
import random
print random.random()*100 # random.random()은 0.0 <= x < 1.0 범위의 부동 소수점 반환. 여기에 100을 곱하면 0.0 <= x < 100.0.
# 10과 100 사이를 정확히 맞추려면 조정 필요: random.random() * 90 + 10
내 솔루션: 파이썬 3
import random
rand_num = random.uniform(10,100) # uniform(a, b)는 a <= x <= b (또는 a <= x < b, 문서 확인 필요) 범위의 부동 소수점 반환
# random.uniform(a,b)는 a <= N <= b 를 만족하는 임의의 부동소수점 숫자를 반환합니다.
print(rand_num)
문제 69
문제
파이썬 모듈을 사용하여 5와 95 사이의 임의의 부동 소수점 숫자를 생성하십시오.
힌트
random.random()을 사용하여 [0,1] 범위의 임의의 부동 소수점 숫자를 생성하십시오.
주요 저자 솔루션: 파이썬 2
import random
print random.random()*100-5 # 0.0 <= x < 1.0 => 0.0 <= x*100 < 100.0 => -5.0 <= x*100-5 < 95.0
# 이 방식은 5와 95 사이를 정확히 보장하지 않음. (최솟값 -5 가능)
# 올바른 방식: random.random() * 90 + 5
내 솔루션: 파이썬 3
import random
rand_num = random.uniform(5,95) # 5 <= N <= 95 범위의 부동 소수점 반환
print(rand_num)