JavaScript
[JS] 코딩테스트 032~034 - 배열의 split() 활용 및 sort() 정렬 메서드
Irene1988
2025. 2. 17. 18:30
문제32 : 문자열 만들기
취업 준비생인 혜림이는 자기소개서를 쓰고 있습니다.
열심히 자기소개서를 작성하던 도중 혜림이는
자기가 지금까지 단어를 얼마나 적었는지 궁금하게 됩니다.
혜림이를 위해 문자열을 입력받으면
단어의 갯수를 출력하는 프로그램을 작성해 주세요.
/*
입출력
입력 : 안녕하세요. 저는 제주대학교 컴퓨터공학전공 혜림입니다.
출력 : 5
*/
입력받은 문장을 " " 띄어쓰기 단위로 잘라 배열로 저장하고 그 배열의 길이값을 구한다.
const words = "안녕하세요. 저는 제주대학교 컴퓨터공학전공 혜림입니다."
console.log(words.split(" ").length);
문제33 : 거꾸로 출력하기
한 줄에 여러개의 숫자가 입력되면,
역순으로 그 숫자들을 하나씩 출력하는 프로그램을 작성하시오.
입출력
입력 : 1 2 3 4 5
출력 : 5 4 3 2 1
입력 : 2 4 6 7 8
출력 : 8 7 6 4 2
const arr = prompt().split(" ").reverse();
let reverseVal = " ";
console.log(arr);
for(let i=0; i<arr.length; i++){
reverseVal = reverseVal + (arr[i]+ " ");
}
console.log(reverseVal);
위에 답은 동영상 강의에서 안내한 답이다. (위에 for문으로 출력한 것이 인상적인다.)
나의 경우에는 좀 다르게 작성했다.
1. prompt를 통해 숫자를 입력받는다.
2. 입력받은 숫자를 띄어쓰기 기준으로 배열로 저장한다.
3. 해당 배열을 reverse()를 이용해 거꾸로 뒤집는다.
4. 이 상태의 배열을 다시 join()을 이용하여 문자열로 만든다.
let str = prompt("숫자를 입력하세요!").split(" ").reverse();
console.log(str);
let reverseVal = " ";
reverseVal = str.join(" ");
console.log("reverseVal: ", reverseVal);
문제34 : sort 구현하기
민주는 체육부장으로 체육시간이 되면
반 친구들이 제대로 키 순서대로 모였는지를 확인해야 한다.
그런데 요즘 민주는 그것이 너무 번거롭게 느껴져 한 번에 확인하고 싶어한다.
민주를 위해 키가 주어지면 순서대로 제대로 섰는지 확인하는 프로그램을 작성해보자.
(키는 공백으로 구분하여 입력됩니다.)
/*
입출력
입력 : 176 156 155 165 166 169
출력 : NO
입력 : 155 156 165 166 169 176
출력 : YES
*/
/*
입출력
입력 : 176 156 155 165 166 169
출력 : NO
입력 : 155 156 165 166 169 176
출력 : YES
*/
const unsorted = "176 156 155 165 166 169";
let sorted = "";
sorted = (unsorted.split(" ").sort(function(a,b){
return a - b;
})).join(" ");
//console.log(sorted);
if(unsorted === sorted) {
console.log("YES");
} else {
console.log("NO");
}
1. sort() 메서드
JavaScript에서 기본적으로 배열을 정렬하는 메서드는 sort()입니다.
기본 동작
- 기본적으로 문자열 기준(사전순) 으로 정렬됩니다.
- 숫자를 정렬할 때는 비교 함수를 제공해야 합니다.
let words = ["banana", "apple", "cherry"];
words.sort();
console.log(words); // ["apple", "banana", "cherry"]
let numbers = [10, 2, 5, 30];
numbers.sort();
console.log(numbers); // [10, 2, 30, 5] (문자열 기준 정렬)
올바른 숫자 정렬
- 숫자를 정렬할 때는 비교 함수를 사용해야 합니다.
let numbers = [10, 2, 5, 30];
// 오름차순 (작은 숫자가 앞에)
numbers.sort((a, b) => a - b);
console.log(numbers); // [2, 5, 10, 30]
// 내림차순 (큰 숫자가 앞에)
numbers.sort((a, b) => b - a);
console.log(numbers); // [30, 10, 5, 2]
- a - b: a가 b보다 작으면 음수를 반환 → 오름차순 정렬
- b - a: b가 a보다 작으면 음수를 반환 → 내림차순 정렬
2. reverse() 메서드
- 배열의 순서를 반대로 뒤집는 메서드입니다.
- 기존 배열을 직접 변경합니다
let numbers = [1, 2, 3, 4, 5];
numbers.reverse();
console.log(numbers); // [5, 4, 3, 2, 1]
sort() + reverse() 활용
- sort()로 정렬한 후 reverse()로 내림차순 정렬 가능
let numbers = [10, 2, 5, 30];
numbers.sort((a, b) => a - b).reverse();
console.log(numbers); // [30, 10, 5, 2]
3. toSorted() (ES2023 추가)
- sort()와 비슷하지만 원본 배열을 변경하지 않음
- 기존 배열을 유지하면서 정렬된 새로운 배열을 반환
let numbers = [10, 2, 5, 30];
let sortedNumbers = numbers.toSorted((a, b) => a - b);
console.log(numbers); // [10, 2, 5, 30] (원본 유지)
console.log(sortedNumbers); // [2, 5, 10, 30]
✅ toSorted()는 기존 배열을 변형하지 않기 때문에 불변성(immutability) 을 유지하고 싶을 때 유용합니다.
4. localeCompare()를 사용한 문자열 정렬
- sort()는 기본적으로 ASCII 코드 기준으로 정렬하므로, 한글이나 다른 언어에서는 제대로 정렬되지 않을 수 있어요.
- localeCompare()를 활용하면 언어별 정렬이 가능합니다.
let koreanWords = ["가", "다", "나", "라"];
koreanWords.sort((a, b) => a.localeCompare(b, "ko"));
console.log(koreanWords); // ["가", "나", "다", "라"]
✅ "ko"를 설정하면 한글 정렬이 올바르게 작동합니다.
5. 객체 배열 정렬
배열에 객체가 들어있을 경우, 특정 키 값 기준으로 정렬할 수 있습니다.
let users = [
{ name: "Alice", age: 25 },
{ name: "Charlie", age: 35 },
{ name: "Bob", age: 30 }
];
// 나이 기준 오름차순 정렬
users.sort((a, b) => a.age - b.age);
console.log(users);
/*
[
{ name: "Alice", age: 25 },
{ name: "Bob", age: 30 },
{ name: "Charlie", age: 35 }
]
*/
// 이름 기준 정렬
users.sort((a, b) => a.name.localeCompare(b));
console.log(users);
/*
[
{ name: "Alice", age: 25 },
{ name: "Bob", age: 30 },
{ name: "Charlie", age: 35 }
]
*/
6. 정렬 관련 다른 방법
1) Array.prototype.sort() + slice() 조합
- sort()는 원본을 변경하므로, slice()로 복사본을 만든 후 정렬 가능
let numbers = [10, 2, 5, 30];
let sortedNumbers = numbers.slice().sort((a, b) => a - b);
console.log(sortedNumbers); // [2, 5, 10, 30]
console.log(numbers); // [10, 2, 5, 30] (원본 유지)
2) Array.prototype.map() + sort() 조합 (성능 최적화)
객체 배열을 정렬할 때, 미리 인덱스를 매핑하면 성능을 개선할 수 있어요.
let users = [
{ name: "Alice", age: 25 },
{ name: "Charlie", age: 35 },
{ name: "Bob", age: 30 }
];
// 성능 최적화된 정렬
let sortedUsers = users
.map((user, index) => ({ ...user, index })) // 원본 인덱스 유지
.sort((a, b) => a.age - b.age) // 정렬
.map(user => ({ name: user.name, age: user.age })); // 인덱스 제거
console.log(sortedUsers);
✅ 이 방식은 대량의 데이터 정렬 시 성능을 개선하는 테크닉입니다.
7. sort()와 관련된 정렬 알고리즘
- JavaScript의 sort()는 V8 엔진에서 Timsort(O(n log n))을 사용합니다.
- Timsort는 Merge Sort와 Insertion Sort를 결합하여 만든 알고리즘으로 성능이 우수합니다.
빠른 정렬이 필요할 경우 QuickSort 구현 예제
function quickSort(arr) {
if (arr.length <= 1) return arr;
let pivot = arr[arr.length - 1];
let left = arr.filter(el => el < pivot);
let right = arr.filter(el => el > pivot);
let middle = arr.filter(el => el === pivot);
return [...quickSort(left), ...middle, ...quickSort(right)];
}
console.log(quickSort([10, 2, 5, 30])); // [2, 5, 10, 30]
🚀 정리
메서드 | 설명 | 원본 변경 |
sort() | 배열 정렬 | ✅ 변경됨 |
toSorted() | 배열 정렬 (원본 유지) | ❌ 유지됨 |
reverse() | 열 뒤집기 | ✅ 변경됨 |
localeCompare() | 자열 정렬 (언어 설정 가능) | ❌ 유지됨 |
📌 Tip:
✔ 숫자 정렬은 sort((a, b) => a - b)를 꼭 사용하세요!
✔ 원본을 유지하면서 정렬하려면 toSorted() 또는 slice().sort() 사용
✔ 대량 데이터 정렬 시 성능 최적화 방법 (map() + sort()) 고려
*위 포스팅은 챗GPT 답변을 토대로 작성되었습니다.