백준 2775번, 리스트의 값 복사

    문제

    https://www.acmicpc.net/problem/2775

     

    2775번: 부녀회장이 될테야

    첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다

    www.acmicpc.net

    나의 풀이

    def trinumber(k,n):
        numberlist=list(range(0,n+1))
        nextnumberlist=list(range(0,n+1))
        for k in range(k): #층수 확인용
            numberlist=nextnumberlist.copy()
            for i in range(1,n+1): #n호까지 돌기
                count=0
                for j in range(1,i+1): #현재 있는 호 사람 수 구해주기
                    count+=numberlist[j]
                nextnumberlist[i]=count
        return nextnumberlist[n]
    
    for i in range(int(input())):
        k=int(input())
        n=int(input())
        print(trinumber(k,n))

    문제 접근

    . 현재 층의 사람 수를 numberlist에 저장하고 윗 층의 사람 수를 nextnumberlist에 저장하였다.

    . 0층의 사람 수는 list(range(0,n+1))을 사용하여 n호까지의 사람을 0부터 n명으로 만들어주었다.(1번째 리스트를 1호로 생각하고 0번째 리스트는 코딩의 편의를 위해 사용하지 않았다.)

    . 삼중 for문을 이용해 첫 번째 for문은 현재 계산하고 있는 층수를 보여주는 용도이고

    두 번째 for문은 현재 층수를 n호까지 돌면서 nextnumberlist를 채워주는 용도이고

    마지막 for문으로는 현재 있는 호의 사람 수를 구하는 용도이다.

     

    배운 내용

    numberlist=nextnumberlist.copy()

    5번째 줄인 이 부분에서  처음에는 numberlist=nextnumberlist로 사용하였는데 그렇게 사용하게 되면 두 개가 주소값이 같은 아예 같은 list가 되어버려 한 list가 변하면 다른 list도 변하는 상황이 발생해버렸다. 즉,같은 list가 이름만 두 개가 된 것이다. 

    따라서 list의 값만을 복사하고 싶다면 

    list_B = list_A.copy()  처럼 사용하거나
    list_B = list_A[:]     처럼 사용해야 한다.

     

    댓글