작성
·
93
2
안녕하세요. 감자님.
병합정렬을 복습하던 도중에 질문이 있어 이렇게 글을 남기게 되었습니다. 좋은 강의 제공해주셔서 너무 감사합니다.
코드를 보면 tempArr.length와 tempArr.fill()을 통해 tempArr의 모든 값을 0으로 미리 채워두셨는데 이 이유가 혹시 Merge()가 각 재귀에서 불릴 때마다 특정 인덱스만 사용하기 때문인가요? 혹시 모르는 IndexOutOfBound나 쓰레기 값에 접근하는 것을 미리 방지하고자 그렇게 설정하신 건지 궁금합니다.
1번 질문에서 연계되는 부분인데 보통 자바스크립트의 배열이나 파이썬의 리스트 같은 경우 배열의 끝에 값을 쉽게 추가할 수 있도록 자체 내장함수를 제공하는 것으로 알고 있습니다. 물론 강의 초반에 자바스크립트의 독특한 메서드를 사용하지는 않는다고 하셨는데 만약에 사용한다면(arr.push(), list.append() 같은 함수) tempArr는 Merge 함수가 불릴 때마다 초기화 되므로 arr에 값을 복사할 때 인덱스 보정이 필요한 지 여쭙고 싶습니다.
답변 1
0
안녕하세요 이지민님!
병합 정렬의 Merge 함수를 보시다가 궁금증이 생기셨군요.
하나씩 답변드리겠습니다!🫡
tempArr는 정렬되지 않은 두 배열을 합친 크기의 배열로 만들며 스택 내 지역변수로 만들어 집니다. 자바스크립트에서 초기화 하지 않은 배열은 undefined값이 저장되기때문에 의도적으로 배열크기만큼 순회하며 0으로 초기화 해줬습니다. 물론 0으로 초기화 하지 않아도 똑같이 동작하겠지만, 저의 코딩 습관으로 이렇게 작성했습니다.😁
Merge함수가 호출될 때마다 tempArr는 스택에 새롭게 생성되기 때문에 이전 실행에 영향을 받지않습니다. push나 append함수로도 원하는 크기로 만들 수 있겠지만, Merge함수 실행 시 배열의 크기를 이미 알 수 있기 때문에 length로 배열을 처음부터 설정해주는 것이 더 좋다고 생각이 들기 때문에 자바스크립트에서도 배열을 이미 만들어 추가하는게 더 좋을 것 같습니다.
궁금증이 해결되셨나요?😄
음... 제가 이해한 부분이 맞는 지 모르겠는데 확인 부탁드립니다.
tempArr의 시작 인덱스가 leftIndex부터이고 강의의 코드에서 소개한 코드는 배열의 초기 세팅을 맞춰놓은 상태에서 해당 인덱스에 값을 덮어쓰는 방식이고 push, append() 같은 배열의 끝에 추가하는 내장함수는 인덱스에 값을 덮어쓰는 것이 아니라 끝에 값을 추가하기 때문에 나중에 arr에 값을 옮길 때 인덱스 보정이 반드시 필요하다.
정도로 이해했습니다. 말을 너무 어렵게 적은 것 같은데... 답변 부탁드립니다!