URL : https://school.programmers.co.kr/learn/courses/30/lessons/12915
JS
문제
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
제한 조건
strings는 길이 1 이상, 50이하인 배열입니다.
strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
모든 strings의 원소의 길이는 n보다 큽니다.
인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
계획
n번째 문자를 문자열 맨 앞에 추가하여 새로운 배열 생성
오름차순 정렬
맨앞의 n번째 문자 지우기
반환
참고, 풀이
substring() 메소드는 string 객체의 시작 인덱스로 부터 종료 인덱스 전 까지 문자열의 부분 문자열을 반환합니다.
const str = 'Mozilla';
console.log(str.substring(1, 3));
// Expected output: "oz"
console.log(str.substring(2));
// Expected output: "zilla"
답
function solution(strings, n) {
return strings
.map((value) => `${value[n]}${value}`)
.sort()
.map((str) => str.substring(1));
}
다른사람 답
function solution(strings, n) {
// strings 배열
// n 번째 문자열 비교
return strings.sort((s1, s2) => s1[n] === s2[n] ? s1.localeCompare(s2) : s1[n].localeCompare(s2[n]));
}
sort() 메서드의 작동 방식
sort() 메서드는 두 요소를 비교하여 반환값에 따라 순서를 결정합니다:
sort()
sort((s1, s2) => 비교식)
비교 함수 (s1, s2)
sort 메서드는 비교 함수 (s1, s2)를 사용합니다.
s1과 s2는 배열에서 비교할 두 문자열입니다.
반환값
반환값이 음수: 첫 번째 요소가 두 번째 요소보다 앞에 위치.
반환값이 0: 두 요소의 순서를 유지.
반환값이 양수: 첫 번째 요소가 두 번째 요소보다 뒤에 위치.
String.prototype.localeCompare()
s1.localeCompare(s2)
- localeCompare()는 두 문자열을 사전 순으로 비교합니다:
- s1이 s2보다 작으면 음수 반환.
- 같으면 0 반환.
- 크면 양수 반환.
- 두 n번째 문자가 같을 경우, 전체 문자열을 사전 순으로 비교하여 정렬합니다.
s1[n].localeCompare(s2[n])
- 두 n번째 문자가 다르다면, localeCompare를 사용해 해당 문자들만 비교합니다:
- s1[n]이 s2[n]보다 작으면 음수 반환.
function solution(strings, n) {
return strings.sort((a, b) => {
const chr1 = a.charAt(n);
const chr2 = b.charAt(n);
if (chr1 == chr2) {
return (a > b) - (a < b);
} else {
return (chr1 > chr2) - (chr1 < chr2);
}
})
}
(a > b) - (a < b)는 compareFunction의 핵심적인 비교 로직으로, 기본적인 사전순 정렬을 구현한 것입니다.
js에서 true - false = 1
sort(compareFunction)의 동작
compareFunction은 배열의 두 요소 a와 b를 비교하여 반환값에 따라 정렬 순서를 결정합니다.
- 첫 번째 조건: 비교 기준인 n번째 문자(chr1, chr2)가 같은 경우
사전순으로(a와 b) 정렬합니다.return (a > b) - (a < b);
- (a > b)는 a가 b보다 크면 true(1) 반환.
- (a < b)는 b가 a보다 크면 true(1) 반환.
- 결과적으로 (a > b) - (a < b)는:
- 1 - 0 = 1 → a가 b 뒤에 위치.
- 0 - 1 = -1 → b가 a 뒤에 위치.
- 0 - 0 = 0 → 순서 유지.
- 두 번째 조건: n번째 문자가 다를 경우
n번째 문자를 기준으로 정렬.return (chr1 > chr2) - (chr1 < chr2);
function solution(strings, n) {
return strings.sort((a, b) => {
const diff = a.charAt(n).localeCompare(b.charAt(n));
return diff !== 0 ? diff : a.localeCompare(b);
});
}
- localeCompare: 두 문자열을 사전순으로 비교합니다.
- a.charAt(n).localeCompare(b.charAt(n))는 n번째 문자를 기준으로 정렬.
- a.localeCompare(b)는 문자 전체를 기준으로 사전순 정렬.
참고
https://school.programmers.co.kr/learn/courses/30/lessons/12915/solution_groups?language=javascript
'내일배움 과제 > 코딩테스트' 카테고리의 다른 글
알고리즘 46번 - 숫자 문자열과 영단어 (0) | 2024.12.25 |
---|---|
알고리즘 44번 - 최소직사각형 (0) | 2024.12.23 |
알고리즘 43번- 크기가 작은 부분 문자열 (0) | 2024.12.22 |
SQL, 알고리즘 문제 풀이 링크 (4) | 2024.12.21 |
알고리즘 42번 - 삼총사 (1) | 2024.12.21 |