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 답변을 토대로 작성되었습니다.