강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của sso01153
sso01153

câu hỏi đã được viết

Giới thiệu về giải quyết vấn đề thuật toán JavaScript (chuẩn bị cho bài kiểm tra mã hóa)

6. Hyeonsu nghịch ngợm

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

Viết

·

556

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()로 복사해야하는 이유가 있나요?

 

 

javascript코딩-테스트

Câu trả lời 3

1

codingcamp님의 프로필 이미지
codingcamp
Người chia sẻ kiến thức

안녕하세요^^

아래 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을 통해 화면에 찍어내는 부분을 저렇게 바꾸게 됩니다.

딥변은 이상입니다.

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

Hình ảnh hồ sơ của sso01153
sso01153

câu hỏi đã được viết

Đặt câu hỏi