알고리즘

파이썬에서 빈 2차원 배열 만들기

민복치 2022. 11. 21. 14:57

DFS, BFS 알고리즘을 다시 익히려고 백준 1260번 문제를 풀고 있었다.

그래프의 연결 상태를 담기 위한 2차원의 빈 배열이 필요해서 

graph = [[] * (N+1)]
# N은 문제에서 인풋으로 받는 숫자이다.

이렇게 graph를 생성했다. 

그리고 각 노드들이 어떻게 연결되어 있는지를 입력받아서 graph에 기록하는데 graph가 내 예상과 다르게 만들어졌다.

 

# 내가 예상한 grpah의 모습
[
  [], 
  [2, 3, 4], 
  [1, 4], 
  [1, 4], 
  [1, 2, 3]
]
# 실제로 출력된 graph의 모습
[
  [1, 1, 1, 2, 2, 3, 3, 4, 4, 4], 
  [1, 1, 1, 2, 2, 3, 3, 4, 4, 4], 
  [1, 1, 1, 2, 2, 3, 3, 4, 4, 4], 
  [1, 1, 1, 2, 2, 3, 3, 4, 4, 4], 
  [1, 1, 1, 2, 2, 3, 3, 4, 4, 4]
]

원인은 초기에 빈 2차원 배열의 graph를 만들때 * 연산자로 빈 배열들을 생성했기 때문이다.

정확히 말하면 빈 배열들을 생성한 것이 아니라, 하나의 빈 배열을 모두가 참조하게 된 것이다.

 

이것은 얕은 복사와 관련이 있다. 

얕은 복사란, 객체를 복사할때 동일한 형태의 새로운 객체를 만든것이 아니라 복사 대상을 참조하는 객체를 만드는 것이다.

그래서 graph에 값을 넣고난 뒤에 출력했을때, grpah내의 각 배열들이 모두 동일한 요소들을 갖게 되는 것이다.

 

결론은 빈 2차원 배열이 필요할 때는 for문을 이용하자.

graph = [[] for _ in range(N+1)]

이런 경우 외에도 파이썬은 객체의 타입에 따라 값을 전달하는 방식을 다르게 채택하는 Call by Assignment 특성이 있기 때문에

이에 주의해서 코드를 짜야한다.