강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

lee_10_님의 프로필 이미지
lee_10_

작성한 질문수

파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)

2. 랜선 자르기(결정알고리즘)

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))

lee_10_님의 프로필 이미지
lee_10_

작성한 질문수

질문하기