AI 보이는 추론 실험실

AI가 목록을 정렬한 뒤 원래 순서를 다시 읽을 수 있을까요?

[12, 3, 8]을 작은 수부터 정렬한 뒤 원본을 다시 읽습니다. 결과가 똑같아 보여도 원래 순서가 남는 방법은 따로 있습니다.

입문게시 2026-11-03읽기·실험 약 10분확인 문제 2개규칙 기반 실행한국논리학협회 자체 제작제작·검수 LTCT 편집부

책상 위에 파란색·빨간색·노란색 카드를 서로 다른 순서로 두 줄 놓고 비교한다. 두 줄 사이에 올리가 있다.
한국논리학협회가 학습 장면을 구성한 AI 생성 사진입니다. · 한국논리학협회 · AI 생성
오늘의 질문

원래 숫자 목록 [12,3,8]을 기록해 두었다고 생각했는데 정렬을 수행한 뒤 원래 목록을 다시 살피니 순서가 달라졌습니다. 어디에서 바뀌었을까요?

숫자 비교 정렬에서 sort의 같은 배열 참조와 toSorted의 별도 배열을 비교한 도해
숫자 비교 정렬에서 sort의 같은 배열 참조와 toSorted의 별도 배열을 비교한 도해 · 한국논리학협회 자체 제작
그림 크게 보기 ↗
01

숫자 목록을 맡긴 두 변수

AI에게 학생이 답을 낸 순서 [12, 3, 8]을 보여 주고, 작은 수부터 정렬한 목록도 만들어 달라고 합니다. 나중에 처음 답한 번호를 확인하려면 두 순서가 모두 필요합니다. 변수 이름 하나를 더 붙여 두면 충분할까요?

실습에서 sort와 숫자 오름차순을 선택하면 결과는 [3, 8, 12]입니다. ‘실행 후 원본’도 [3, 8, 12]가 됩니다. 자바스크립트의 sort()는 호출한 배열 안에서 순서를 바꾼 다음 같은 배열을 돌려줍니다. 결과에 새 이름을 붙여도 그 이름은 같은 배열을 가리킵니다.

02

원래 답한 순서를 남기는 방법

메서드를 toSorted로 바꾸어 보세요. 매번 같은 [12, 3, 8]에서 다시 시작합니다. 정렬한 결과는 앞선 실험과 같지만 이번에는 원본의 첫 값이 12로 남습니다. toSorted()가 새 배열에 정렬된 순서를 담아 돌려주기 때문입니다.

‘원본 === 결과’는 두 변수가 같은 배열을 가리키는지 확인하는 식입니다. sort()에서는 true, toSorted()에서는 false가 나옵니다. 숫자가 어느 순서로 보이는지와 그 숫자를 담은 배열이 같은지는 따로 확인할 수 있습니다.

03

12가 3보다 앞에 놓이는 까닭

비교 기준을 ‘기본 문자열 순서’로 바꾸면 [12, 3, 8]이 그대로 보입니다. 비교 함수를 생략하면 이 숫자들은 문자열로 비교됩니다. ‘12’의 첫 글자 ‘1’이 ‘3’보다 앞서므로 이미 그 기준에 맞는 순서입니다.

다시 숫자 오름차순을 고르면 비교 함수는 두 값의 차이를 사용합니다. 같은 입력이 [3, 8, 12]로 바뀝니다. 순서가 처음과 같았다는 관찰만으로 원본이 보호된다고 결론 내리기 어려운 까닭이 여기에 있습니다.

04

숫자 대신 학생 기록을 담으면

숫자 배열은 새 배열 하나로 처음 순서를 보관할 수 있습니다. 이제 각 칸에 학생의 이름과 점수가 든 기록을 넣었다고 생각해 보세요. toSorted()로 만든 두 배열은 순서를 따로 갖지만, 각 칸은 같은 학생 기록을 가리킬 수 있습니다.

따라서 원본의 순서를 보관하는 일과 원래 점수까지 별도로 보관하는 일에는 서로 다른 조치가 필요합니다. AI가 만든 코드를 살필 때에는 ‘무엇을 보존하려 했는가’를 먼저 적고 그 값이 정렬 뒤에도 남아 있는지 확인해 보세요.

직접 확인하기 · 규칙 기반 실행

원본을 고치는 정렬과 복사 정렬 비교

숫자 비교 함수 유무와 메서드를 각각 바꾸어 원본과 결과를 나란히 표시합니다.

같은 초기 배열로 정렬을 다시 실행합니다

각 선택마다 [12,3,8]에서 새로 출발합니다. 이전 결과를 다시 정렬하는 실험과 구별하세요.

처음 기록: [12, 3, 8]

실행 후 원본: [3, 8, 12]

반환된 결과: [3, 8, 12]

원본 === 결과: true

이번 입력에서 원본 순서 변화: 있음

같은 배열을 반환합니다. 이미 기준에 맞는 입력이면 순서가 그대로여도 비변경 메서드가 되는 것은 아닙니다.

관계를 읽고, 다른 상황에 적용하기

두 문제로 생각 확인

1const records = [12,3,8]; records.sort((a,b)=>a-b);를 실행한 뒤 records의 값은 무엇인가요?
2[12,3,8].toSorted((a,b)=>a-b) 결과와 원본은?

두 문제의 답을 모두 선택하면 해설을 볼 수 있습니다.

나의 설명으로 마무리

오늘 발견한 관계

저장 위치를 확인하고 있습니다…

출처와 제작 안내

원문을 참고해 설명·도표·문항·실험을 새로 작성했습니다. 별도 표시가 없는 사례와 수치는 학습을 위한 가상 예시입니다. 원문 번역이나 실제 모델의 성능 평가 자료가 아닙니다.

  1. Array.prototype.sort() ↗MDN Web DocsArray.prototype.sort()

    MDN의 원본 배열 변경과 기본 정렬의 문자열 기준 설명 확인.

  2. Array.prototype.toSorted() ↗MDN Web DocsArray.prototype.toSorted()

    MDN의 새 배열 반환·원본 유지 설명 확인.