인프런 커뮤니티 질문&답변
def 안에 while 문 사용 시 변수 문제
작성
·
897
0
import sys
#sys.stdin=open("input.txt", "rt")
a, b = map(int,input().split())
Line = []
for i in range(a):
tmp = int(input())
Line.append(tmp)
lt = 1
rt = max(Line)
def binary_search(x, y, z):
global res
while x<=y :
sum = 0
mid = (x+y)//2
for i in Line :
sum += i//mid
if sum >= b :
res = mid
return binary_search(mid+1,y,z)
else :
return binary_search(x,mid-1,z)
return res
print(binary_search(lt,rt, b))
다음과 같은 코드입니다.
답은 맞혔으나 개인적인 궁금함으로 질문합니다.
def 문 안에 global res라고 선언을 안하고
단순히 res = 0이라고 선언을 했을 때
제 생각하에 while문이 돌면 res=mid으로 새롭게 저장이 되고
return res 하면 저장한 mid값이 나와야할거같은데
변수 선언할 때 사용한 0 값이 나옵니다 ㅠㅠㅠ
def 안에서 변수를 선언하면 다 적용되는거 아니였나요?
궁금해서 질문해봅니다...
global res라고 하니까 문제는 해결 됐는데, 변수 함부로 전역 변수로 선언하기 싫어서 이렇게 질문드립니다 ㅠㅠ
답변 1
0
안녕하세요^^
문제에 있은 입력예제를 가지고 설명하면
최초에 호출된 재귀함수 binary_search(1, 802, 11)은 맨 마지막 재귀함수인 binary_search(201, 200, 11)가 리턴한 값을 받는 겁니다.
즉 binary_search(1, 802, 11)는 binary_search(1, 400, 11)이 리턴한 값을 받고,
binary_search(1, 400, 11)은 binary_search(201, 400, 11)이 리턴한 값을 받고,
.
.
.
binary_search(201, 202, 11)는 binary_search(201, 200, 11)이 리턴한 값을 받습니다.
최종적으로 거꾸로 전달받아 올라가면 binary_search(1, 802, 11)는 binary_search(201, 200, 11)가 리턴한 값을 받는 겁니다.
문제에 있는 예제입력으로 아래코드에 실행시켜보세요.
import sys
sys.stdin=open("input.txt", "rt")
a, b = map(int,input().split())
Line = []
for i in range(a):
tmp = int(input())
Line.append(tmp)
lt = 1
cnt=0
rt = max(Line)
def binary_search(x, y, z):
global cnt
cnt+=1
res=cnt
print(x, y, z, res)
while x<=y :
sum = 0
mid = (x+y)//2
for i in Line :
sum += i//mid
if sum >= b :
res = mid
return binary_search(mid+1,y,z)
else :
return binary_search(x,mid-1,z)
return res
print(binary_search(lt,rt, b))





