이게 왜 이렇게 되는 건지 궁금합니다.

최근에 트랙백에 대해 알게 되어서 코딩 도장에서 문제를 풀고 있었는데요
(문제 주소: http://codingdojang.com/scode/606)

제가 일단 얼떨결에 처음 출력을 예쁘게 하기 위해 이 방법을 썼더니 정답이 나왔습니다. 그런데 이것을 return이나 그냥 print()를 하려고 하니까 None이 나오거나 원본 리스트가 자꾸 출력되는데 그 이유가 무엇인지 궁금합니다.

코드는 아래와 같습니다.

inp="""------24--00--00--00------
----00--00--26--36--00----
--00--21--00--00--28--32--
18--00--15------00--00--00
--00--00--00--08--01--00--
----00--10--00--00--03----
------12--00--00--05------"""
numlst=["0"+str(num) if len(str(num))==1 else str(num) for num in range(1,37)]
lst=[]
for ln in inp.split("\n"):
    elst=[""]*13
    for n in range(13):
        elst[n]=ln[n*2]+ln[n*2+1]
    lst.append(elst)
for ln in lst:
    for cmp in ln:
        print("%1s"%cmp, end="")
    print()

n=1
maxX,maxY=len(lst[0]),len(lst)
def solve(y,x):
    global n
    if n==36:
        for ln in lst:
            for cmp in ln:
                print("%1s"%cmp, end="")
            print()
    else:
        for dx, dy in [(-1,-1),(1,-1),(2,0),(1,1),(-1,1),(-2,0)]:
            nx,ny=x+dx,y+dy
                        if 0<=nx<maxX and 0<=ny<maxY and lst[ny][nx]!="--":
                if lst[ny][nx]=="00" or int(lst[ny][nx])==int(lst[y][x])+1:
                    on=lst[ny][nx]
                    lst[ny][nx]=numlst[n]
                    n+=1
                    solve(ny,nx)
                    lst[ny][nx]=on
                    n-=1
solve(4,9)

제가 답답한 부분은 바로 여기입니다.

     if n==36:
        for ln in lst:
            for cmp in ln:
                print("%1s"%cmp, end="")
            print()

이 부분에서 n이 36까지 간 것까지 확인이 됐는데, 이렇게 for구문으로 lst를 불러서 쓸 경우에만 정답이 나오고
왜 return 나 print를 쓰면 원하는 대로 출력이 안 되는 것인지 궁금합니다.
(global lst를 해봐도 그대로고 여러 가지 시도를 해봤는데 원인이 무엇인지 모르겠습니다.)


    if n==36:
       return lst #결과: None

        if n==36:
           print(lst) #결과: inp값을 담은 lst가 나옴

gfdhjkl0642 667

M 2020년 9월 5일 11:54 오후

목록으로
1개의 답변이 있습니다. 1 / 1 Page

코드를 이해하고 답변드리는건 아닙니다만..
recursive function 및 구조로 인해 return 부분이 결과가 바로 빠져나오지 않을것 같습니다. solve(y,x) 안에서 또 solve(ny,nx) 호출 등등.. 아마 여러번 불려지고 돌려주는 과정에서 올바르게 return 되지 않는 것이라 추정해봅니다.

corsair

2020년 9월 18일 5:05 오후