숫자 100이 왜 맨 앞에 오나요?
자바스크립트(JavaScript, 웹페이지 등에 쓰이는 프로그래밍 언어)의 일반 배열에서 sort()를 호출하면 비교 기준을 정하는 함수를 함께 줄 수 있습니다. 이 함수를 생략하면 각 값을 문자열로 바꿔 그 문자 순서를 비교합니다. [3, 21, 100, 4]의 결과는 [100, 21, 3, 4]입니다.
문자열 "100"의 첫 글자는 "1"입니다. "21"의 첫 글자 "2", "3", "4"를 차례로 비교하므로 이 순서가 나옵니다. 정확히는 문자를 나타내는 UTF-16 코드 단위의 값을 비교합니다. 여기서는 숫자 0부터 9까지의 문자 순서에 주목하면 됩니다. 비교를 위해 문자열로 읽더라도 결과 배열의 값은 원래의 숫자형으로 남습니다.
숫자의 크기순으로 정렬하려면 어떻게 쓰나요?
숫자 배열에는 sort((a, b) => a - b)처럼 비교 함수를 줄 수 있습니다. 3과 21을 비교하면 3-21은 음수이므로 3이 앞에 옵니다. 21과 4를 비교하면 21-4는 양수이므로 4가 앞에 옵니다. 두 수가 같아 차이가 0이면 두 원소의 기존 순서를 유지합니다. 결과는 [3, 4, 21, 100]입니다.
큰 수부터 놓으려면 비교 함수를 (a, b) => b - a로 바꿉니다. 같은 배열의 결과는 [100, 21, 4, 3]입니다. 이 실습은 유한한 숫자형 값만 다룹니다. 문자열과 숫자를 섞거나 NaN처럼 정상적인 숫자 비교가 어려운 값을 넣으면 입력 확인과 별도의 처리 규칙이 필요합니다.
정렬하면 원래 배열도 바뀌나요?
원본 배열에 sort()를 실행하면 그 배열의 순서가 바뀝니다. 정렬 전 상태를 남기려면 [...numbers].sort((a, b) => a - b)처럼 복사한 배열을 정렬할 수 있습니다. 대괄호 안의 ...numbers는 numbers에 있는 원소를 새 배열에 넣는 표현입니다.
numbers.toSorted((a, b) => a - b)도 정렬된 새 배열을 돌려줍니다. 아래 활동은 같은 입력을 복사해 기본 정렬·숫자 오름차순·숫자 내림차순을 각각 실행합니다. 원본과 결과를 나란히 보면 비교 기준에 따른 차이를 확인할 수 있습니다.
AI가 만든 정렬 코드는 어떤 수로 확인하나요?
[2, 10, 1]을 넣으면 기본 정렬은 [1, 10, 2], 숫자 오름차순은 [1, 2, 10]이 됩니다. 자릿수가 다른 수가 들어 있어 두 규칙의 차이가 드러납니다. 음수와 중복값을 넣은 [-2, 3, 3, 10]도 실행해 보세요. 숫자 오름차순에서는 -2가 맨 앞에 오고 3 두 개가 그대로 남아야 합니다.
결과를 읽을 때는 이웃한 두 수의 크기를 차례로 비교합니다. 오름차순이라면 앞의 수가 뒤의 수와 같거나 작아야 합니다. 입력에 있던 값과 개수도 유지되는지 확인해 보세요. 원본 보존이 필요한 작업에서는 정렬을 마친 뒤 원본 배열의 순서까지 살피면 됩니다.

