inflearn logo
강의

Khóa học

Chia sẻ kiến thức

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

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

571

sso01153

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

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

안녕하세요^^

아래 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

communityai8509

안녕하세요, 인프런 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

effino

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

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

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

다만, 제 최초 의도는 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

89

2

정렬 가능 여부 판단하기

0

75

2

알고리즘 학습법 관련해서 질문드립니다.

0

92

1

코드 리뷰 부탁드립니다!

0

99

1

indexOf를 사용해서 풀어보았습니다 !!

0

73

1

저는 이런식으로 구현 해보았습니다 !!

0

66

1

12,13,14 강의 소리만 나오고 검은 화면입니다

0

106

3

반복문 최소화하고 indexOf 사용해서 풀어봤습니다

0

69

1

영상 보기 전에 직접 풀어봤습니다.

0

77

1

섹션1의 17번문제 이 풀이로 풀어도 될까요?

0

137

2

정규표현식으로 처리해도 상관없나요 ?

0

123

2

3칸씩 건너뛸 수 있을 경우

0

128

2

강의에 대해 질문있습니다.

0

139

2

Object와 Set을 이용해 풀어봤습니다.

0

123

2

이렇게 해도 되나요?

0

104

2

선생님 중복 단어나 중복관련 문제들은 set을 이용하면 좋을것 같습니다.

0

148

2

이렇게 풀어도 괜찮을까요?

0

143

1

이렇게 풀어도 괜찮을까요?

0

121

1

모든 아나그램 찾기에서 시간복잡도

0

102

1

코드리뷰 부탁드립니다.

0

134

1

for loop 탈출은 return 문으로 해도 되지 않나요?

0

133

1

투포인트알고리즘으로 풀어봤습니다.

0

144

0

코드 리뷰 부탁드립니다.

0

120

1

코드 맞게 작성한 거 아닌가여??

0

149

1