알고리즘
파이썬에서 빈 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 특성이 있기 때문에
이에 주의해서 코드를 짜야한다.