이게 왜 이렇게 되는 건지 궁금합니다.
최근에 트랙백에 대해 알게 되어서 코딩 도장에서 문제를 풀고 있었는데요
(문제 주소: 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 님 668
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 오후