강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

이지민님의 프로필 이미지
이지민

작성한 질문수

그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)

정렬 - 병합정렬

병합정렬에서 질문이 있습니다.

작성

·

93

2

안녕하세요. 감자님.

병합정렬을 복습하던 도중에 질문이 있어 이렇게 글을 남기게 되었습니다. 좋은 강의 제공해주셔서 너무 감사합니다.

 

  1. 코드를 보면 tempArr.length와 tempArr.fill()을 통해 tempArr의 모든 값을 0으로 미리 채워두셨는데 이 이유가 혹시 Merge()가 각 재귀에서 불릴 때마다 특정 인덱스만 사용하기 때문인가요? 혹시 모르는 IndexOutOfBound나 쓰레기 값에 접근하는 것을 미리 방지하고자 그렇게 설정하신 건지 궁금합니다.

 

  1. 1번 질문에서 연계되는 부분인데 보통 자바스크립트의 배열이나 파이썬의 리스트 같은 경우 배열의 끝에 값을 쉽게 추가할 수 있도록 자체 내장함수를 제공하는 것으로 알고 있습니다. 물론 강의 초반에 자바스크립트의 독특한 메서드를 사용하지는 않는다고 하셨는데 만약에 사용한다면(arr.push(), list.append() 같은 함수) tempArr는 Merge 함수가 불릴 때마다 초기화 되므로 arr에 값을 복사할 때 인덱스 보정이 필요한 지 여쭙고 싶습니다.

답변 1

0

감자님의 프로필 이미지
감자
지식공유자

안녕하세요 이지민님!

병합 정렬의 Merge 함수를 보시다가 궁금증이 생기셨군요.

하나씩 답변드리겠습니다!🫡

 

  1. tempArr는 정렬되지 않은 두 배열을 합친 크기의 배열로 만들며 스택 내 지역변수로 만들어 집니다. 자바스크립트에서 초기화 하지 않은 배열은 undefined값이 저장되기때문에 의도적으로 배열크기만큼 순회하며 0으로 초기화 해줬습니다. 물론 0으로 초기화 하지 않아도 똑같이 동작하겠지만, 저의 코딩 습관으로 이렇게 작성했습니다.😁

  2. Merge함수가 호출될 때마다 tempArr는 스택에 새롭게 생성되기 때문에 이전 실행에 영향을 받지않습니다. push나 append함수로도 원하는 크기로 만들 수 있겠지만, Merge함수 실행 시 배열의 크기를 이미 알 수 있기 때문에 length로 배열을 처음부터 설정해주는 것이 더 좋다고 생각이 들기 때문에 자바스크립트에서도 배열을 이미 만들어 추가하는게 더 좋을 것 같습니다.

궁금증이 해결되셨나요?😄

이지민님의 프로필 이미지
이지민
질문자

음... 제가 이해한 부분이 맞는 지 모르겠는데 확인 부탁드립니다.

tempArr의 시작 인덱스가 leftIndex부터이고 강의의 코드에서 소개한 코드는 배열의 초기 세팅을 맞춰놓은 상태에서 해당 인덱스에 값을 덮어쓰는 방식이고 push, append() 같은 배열의 끝에 추가하는 내장함수는 인덱스에 값을 덮어쓰는 것이 아니라 끝에 값을 추가하기 때문에 나중에 arr에 값을 옮길 때 인덱스 보정이 반드시 필요하다.

정도로 이해했습니다. 말을 너무 어렵게 적은 것 같은데... 답변 부탁드립니다!

감자님의 프로필 이미지
감자
지식공유자

이해하고 있으신게 맞습니다.
push나 append를 이용하면 arr에 들어갈 인덱스가 맞지 않아서 tempArr값을 arr로 옮길 때 따로 계산을 해서 적절한 arr값을 찾아줘야 합니다.
이 작업이 없다면 배열 접근시 IndexOutOfBound가 발생하고 undefined된 값을 가지기 때문에 정렬이 올바르게 되지 않을 겁니다.😄

이지민님의 프로필 이미지
이지민
질문자

답변 너무 감사합니다! 행복한 연휴 보내세요!

감자님의 프로필 이미지
감자
지식공유자

지민님도 행복한 연휴 되시길 바랍니다.
감사합니다! 🤗

이지민님의 프로필 이미지
이지민

작성한 질문수

질문하기