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

sso01153님의 프로필 이미지
sso01153

작성한 질문수

자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)

6. 장난꾸러기 현수

새로운 배열 만들때 질문입니다

작성

·

457

1

안녕하세요, 선생님

1) m 변수에 바로 arr 정렬해서 넣어서 원래 값과 비교하면 왜 답이 안나오는 걸까요..?

 

function sol(arr){

let ans =[];

let m = arr.sort((a,b)=>a-b);

for(let i = 0; i < arr.length; i++){

if(arr[i] !== m[i]) ans.push(i+1);

}

return ans;

}

let m = [120, 125, 152, 130, 135, 135, 143, 127, 160];

console.log(sol(m));

 

2) let m = arr;

arr.sort((a,b)=>a-b);

 

이렇게 했을때도 답이 안나오는 이유는 무엇일까요?

slice()로 복사해야하는 이유가 있나요?

 

 

답변 3

1

김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

아래 AI인턴이 맞게 답을 한 것 같네요. ChatGPT가 대단하긴 하네요.

  1. arr.sort((a, b) -> a - b)는 arr배열을 오름차순 정렬하는 코드입니다. let m = arr.sort((a, b) -> a - b)는 정렬된 arr배열을 m에 대입하므로 m과 arr는 같은(동일) 배열입니다.

  2. 1번과 같은 이유입니다. let m = arr를 하면 m에 arr의 주소가 저장되어 m과 arr는 같은(동일) 배열을 참조하고 있게 됩니다. 그래서 arr.sort((a, b) -> a - b)를 하면 arr이 참조하는 배열이 오름차순 정렬되는데 이 의미는 m이 참조하는 배열도 오름차순 정렬된다는 의미입니다. 왜냐면 arr과 m은 메모리상에 존재하는 동일 배열을 참조 하고 있기 때문입니다. 그래서 let m = arr.slice()로 하면 arr이 참조하는 원본배열이 아닌 원본배열과 동일한 새로운 배열이 메모리에 생성(복사)되고 그 새로운 배열의 주소를 m에 저장됩니다. 결론적으로 arr은 원본배열을 참조하고, m은 메모리상에 새롭게 생성된 배열을 참조하고 있게 됩니다. 그러면 arr.sort((a, b) -> a - b)를 해도 arr이 참조하는 배열만 오름차순되고 m이 참조하는 배열은 원본 그대로 있게 됩니다.

1

안녕하세요, 인프런 AI 인턴이에요.

  1. m 변수에 arr 배열을 정렬해서 넣고, 원래 값과 비교하는 방법으로는 원래 배열의 순서가 바뀌기 때문에 답이 제대로 나오지 않을 수 있습니다. 예를 들어, [2, 4, 1, 3] 이라는 배열이 있을 때, sort() 함수를 이용해 [1, 2, 3, 4] 로 정렬하면, 원래 배열의 순서가 바뀌므로 [0, 3] 이라는 결과를 얻게 됩니다.

  2. let m = arr; arr.sort((a,b)=>a-b); 라고 작성하면, 먼저 arr 변수의 참조값을 m 변수에 할당한 다음, arr 변수를 정렬합니다. 따라서 m 변수의 값 또한 정렬된 배열로 변경되어 답이 제대로 나오지 않을 수 있습니다. 이러한 문제를 해결하기 위해서는, arr 배열을 복사하여 사용해야 합니다. slice() 함수를 이용하면 배열을 복사할 수 있습니다. 따라서 let m = arr.slice(); 와 같이 작성하면, arr 배열의 복사본을 m 변수에 할당하여 사용할 수 있습니다.

0

안녕하세요. 에피노입니다.

먼저 답변이 늦어 죄송합니다.

보내주신 소스 코드를 보면 오름차순 정렬까지는 잘 진행하신것 같습니다.

다만, 제 최초 의도는 forEach문 안에서 forEach문을 추가 작성(2중For문)을 통하여 이중배열내 값 하나하나를

가져 올 수 있다는 것을 보여드리고 싶었습니다.

제가 같이 올려드린 예제의 답에서도 forEach를 2번 사용하는 것으로 되어있습니다.

보내주신 소스 코드를 제 의도대로 수정한다면,

 

    for(i=0; i<arr.length; i++){

        var arrSort = arr[i].sort(function(left, right){

            return left - right;

        });

    }

    arr.forEach(function(arr2){

        arr2.forEach(function(item, index, array){

            console.warn(item);

        })

    });

정렬후, console을 통해 화면에 찍어내는 부분을 저렇게 바꾸게 됩니다.

딥변은 이상입니다.

강의를 시청해주셔서 감사합니다.

sso01153님의 프로필 이미지
sso01153

작성한 질문수

질문하기