작성
·
463
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가 대단하긴 하네요.
arr.sort((a, b) -> a - b)는 arr배열을 오름차순 정렬하는 코드입니다. let m = arr.sort((a, b) -> a - b)는 정렬된 arr배열을 m에 대입하므로 m과 arr는 같은(동일) 배열입니다.
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 인턴이에요.
m 변수에 arr 배열을 정렬해서 넣고, 원래 값과 비교하는 방법으로는 원래 배열의 순서가 바뀌기 때문에 답이 제대로 나오지 않을 수 있습니다. 예를 들어, [2, 4, 1, 3] 이라는 배열이 있을 때, sort() 함수를 이용해 [1, 2, 3, 4] 로 정렬하면, 원래 배열의 순서가 바뀌므로 [0, 3] 이라는 결과를 얻게 됩니다.
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을 통해 화면에 찍어내는 부분을 저렇게 바꾸게 됩니다.
딥변은 이상입니다.
강의를 시청해주셔서 감사합니다.