파이썬 코드 질문 드립니다.

조회수 581회

동적프로그래밍 LCS 문제를 푸려고 하는데 Array 출력이 계속 이상하게 되네요.. 코드는 아래와 같은데

A = "ABCBDAB"
B = "BDCABA"

lcsarray =  [[0]*(len(B)+1)]*(len(A)+1)
def lcs(x,y):
    for i in range (1,len(x)+1):
        for k in range(1,len(y)+1):
            if x[i-1]==y[k-1]:
                lcsarray[i][k] = lcsarray[i-1][k-1]+1
            else:
                lcsarray[i][k] = max(lcsarray[i-1][k],lcsarray[i][k-1])

for i in lcsarray:
    print(i)
print()

lcs(A,B)


print()
for i in lcsarray:
    print(i)

이미지 결과는 이렇게 나오네요 첫째줄은 for loop 에서 안건드렸는데 왜 저렇게 나올가요?

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    lcsarray = [[0]*(len(B)+1)]*(len(A)+1)lcsarray = [[0]*(len(B)+1) for _ in range(len(A)+1)]로 바꾸면 됩니다.
    첫번째는 list안에 [0] * (len(B)+1)을 똑같이 복사했기 때문입니다.
    즉, 첫번째 lcsarray[0] ~ lcsarray[len(A)]까지 같은 객체입니다. 그래서 lcsarray[0]을 수정하면 나머지 lcsarray[1] ~ lcsarray[len(A)]도 똑같이 바뀝니다.
    첫번째와 같은 프로그래밍은 하지 않는게 좋습니다.
    더욱이, 객체 id를 확인해보면 같다고 나올겁니다.

    aa = [[0] * 3] * 4
    for a in aa:
        print(id(a)) # 동일한 id
    
    aa[0][1] = 99
    for a in aa:
        print(a)
    
    bb = [[0] * 3 for _ in range(4)]
    for b in bb:
        print(id(b)) # 다른 id
    

    더 자세히 알고 싶다면 aliasing, shallow copy, deep copy에 대해 공부해보세요.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 해결되었네요 감사합니다! 최진형 2020.5.5 23:57

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)