오늘 아침에 모닝 알고리즘을 풀면서 겪었던 경험에 대한 기록이다.
2차원 배열을 선언해야 하는 문제가 있어서 배열을 선언하는 중에 모든 배열의 값에 0을 넣어두고 시작하는 방식으로 구성하게 되었다.
1차원 배열을 선언하고 초기화 하는 과정을 생각해보았을 때
rows = 10
arr =[0]*rows 이런 방식의 문법을 사용했던 것을 생각하여 밑의 방식과 같이 2차원 배열을 선언
rows =5
cols = 3
arr = [[0]*cols] *rows
행과 열에 0을 넣어두고 arr[0][0]의 위치에 값을 1로 치환하려고 하였으나 여기서 문제가 발생하였다.
밑의 모습과 같이 1행 1열의 값에만 1이 들어가는 것이 아니고 모든 1열의 값에 1이 들어가는 현상이 발생
해당 문제는 * 연산자를 이용해서 배열을 선언하게 되면 얕은 복사(shallow copy)가 진행되게 되어서 발생하는 문제라고 하며 이것은 즉 배열 내의 요소들이 같은 객체를 가리키게 되는 것이다. 따라서 2차원 배열로 구성되어있어서 첫 행의 객체라고 생각했던 arr [0][0]이 모든 객체를 바라보는 모습이 되는 것이므로 선언의 방법부터 다시 생각하고 선언하는 것이 필요하다.
올바른 방법
2차원 배열을 올바른 방식으로 선언하게 되려면 for문을 사용해서 선언을 해주면 되겠다. 수 많은 알고리즘 문제 해결에도 해당 방식을 사용해왔지만 위와 같은 방식도 문제가 없다고 착각한 나의 실수였고 올바른 방식은 밑을 참고하도록 한다.
rows = 10
cols = 5
arr = [[0 for j in range(cols)] for i in range(rows)]
실수로 인한 작은 해프닝이었지만 배열 선언을 할때 꼭 신경 써야 하는 부분으로 생각된다.
'DevLog' 카테고리의 다른 글
[WIL] 프리온보딩 두번째 과제 회고록 - 페이히어 (0) | 2022.07.11 |
---|---|
[WIL] 프리온보딩 첫번째 과제 회고록 - 랩큐 (0) | 2022.07.11 |
[Unity 게임개발] Player character 변경과 장애물 변경관련 정리 (0) | 2022.07.03 |
[Setting] pipenv 사용하기 (0) | 2022.06.29 |
[DRF] 장고 REST Framework란? 그리고 Serialization (0) | 2022.05.04 |