윤일무이
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 문자열 내 마음대로 정렬하기 본문
문제 및 제한사항
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
**제한사항**
strings는 길이 1 이상, 50이하인 배열입니다.
strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
모든 strings의 원소의 길이는 n보다 큽니다.
인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
풀이 방법
주어진 리스트 안의 문자열 인덱스 0으로 정렬하는 것이 아닌 주어진 인덱스 n번째에 맞춰 정렬해야 한다.
2분 30초쯤, sort가 비교하는 원리에 대해 생각해보자.
let arr = [27, 8, 5, 13] 이 있을 때, arr.sort((a, b) => {console.log(a, b) return a - b})를 하면 어떻게 비교를 할까?
오름차순으로 하나씩 비교를 해서 더 큰 수, 더 작은 수를 찾아나간다.
8 27 (8)> 5 8 (5) > 5 13 (여기까지 왔을 때 5가 제일 작음을 알 수 있다)
13 8 (13) > 13 27(27) (27이 제일 큼을 알 수 있다)
해서 오름차순으로 정렬할 경우 arr = [5, 8, 13, 27] 이렇게 된다.
주어진 strings = ["sun", "bed", "car"] 에서 1번째 인덱스끼리 비교를 해야 한다.
u, e, a 끼리 비교를 해야 하는 상황이다.
a의 1번째 문자열이 b의 1번째 문자열보다 뒤에 오는 경우에는 1을 반환하고, 앞에 오는 경우에는 -1을 반환한다.
즉 a[1] > b[1] 라면 1을 반환하는 이 경우는 a의 1번째 인덱스가 b의 1번째 인덱스보다 더 크다 (뒤에 있음)을 의미한다.
앞에도 뒤에도 아닌, 동일한 경우에는 a와 b 를 사전순으로 비교해 정렬해야 하기 때문에 a, b 자체로도 똑같이 조건문을 적어준다.
a, b 자체를 구분한다는 건 유니코드 순서를 말한다. 처음엔 a[0]이나 a[n+1]로는 안되나 생각했는데 당연이 안되지^^ 였음...
sort의 원리가 잘 이해되지 않아서 오래 걸렸던 문제였다.
코드
function solution(s, n) {
return s.sort((a, b) => {
if (a[n] > b[n]) {
return 1;
} else if (a[n] < b[n]) {
return -1;
} else {
if (a > b) {
return 1;
} else if (a < b) {
return -1;
} else {
return 0;
}
}
});
}'⚙️ 코딩테스트' 카테고리의 다른 글
| [JavaScript] 프로그래머스 코딩테스트 레벨 1 : K번째 수 (0) | 2023.04.19 |
|---|---|
| [JavaScript] 프로그래머스 코딩테스트 레벨 1 : 숫자 문자열과 영단어 (0) | 2023.04.18 |
| [JavaScript] 프로그래머스 코딩테스트 레벨 1 : 비밀지도 (0) | 2023.04.18 |
| [JavaScript] 프로그래머스 코딩테스트 레벨 1 : 최소 직사각형 (0) | 2023.04.15 |
| [JavaScript] 프로그래머스 코딩테스트 레벨 1 : 삼총사 (0) | 2023.04.15 |