새로운 배열 만들때 질문입니다
566
작성한 질문수 4
안녕하세요, 선생님
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을 통해 화면에 찍어내는 부분을 저렇게 바꾸게 됩니다.
딥변은 이상입니다.
강의를 시청해주셔서 감사합니다.
continue를 사용하는 이유
0
82
2
정렬 가능 여부 판단하기
0
66
2
알고리즘 학습법 관련해서 질문드립니다.
0
86
1
코드 리뷰 부탁드립니다!
0
90
1
indexOf를 사용해서 풀어보았습니다 !!
0
69
1
저는 이런식으로 구현 해보았습니다 !!
0
64
1
12,13,14 강의 소리만 나오고 검은 화면입니다
0
101
3
반복문 최소화하고 indexOf 사용해서 풀어봤습니다
0
63
1
영상 보기 전에 직접 풀어봤습니다.
0
75
1
섹션1의 17번문제 이 풀이로 풀어도 될까요?
0
136
2
정규표현식으로 처리해도 상관없나요 ?
0
120
2
3칸씩 건너뛸 수 있을 경우
0
126
2
강의에 대해 질문있습니다.
0
136
2
Object와 Set을 이용해 풀어봤습니다.
0
117
2
이렇게 해도 되나요?
0
102
2
선생님 중복 단어나 중복관련 문제들은 set을 이용하면 좋을것 같습니다.
0
145
2
이렇게 풀어도 괜찮을까요?
0
138
1
이렇게 풀어도 괜찮을까요?
0
113
1
모든 아나그램 찾기에서 시간복잡도
0
98
1
코드리뷰 부탁드립니다.
0
130
1
for loop 탈출은 return 문으로 해도 되지 않나요?
0
133
1
투포인트알고리즘으로 풀어봤습니다.
0
142
0
코드 리뷰 부탁드립니다.
0
120
1
코드 맞게 작성한 거 아닌가여??
0
146
1





