문제
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
- strings는 길이 1 이상, 50이하인 배열입니다.
- strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
- strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
- 모든 strings의 원소의 길이는 n보다 큽니다.
- 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
strings | n | return |
["sun","bed", "car"] | 1 | ["car","bed","sun"] |
["abce", "abcd", "cdx"] | 2 | ["abcd","abce","cdx"] |
문제풀이
function solution(strings, n) {
var answer = [];
let map = new Map()
for(let i=0;i<strings.length;i++){
const key = strings[i][n]
map.set(strings[i][n],strings[i])
}
const entries = Array.from(map)
const sortedEntries = entries.sort((a, b) => a[0].localeCompare(b[0]));
answer = sortedEntries.map(a => a[1])
return answer;
}
map을 사용해 [n번째 인덱스값 : strings] 형식으로 만들어 key 값으로 정렬한 뒤 value값만 배출 하는 식으로 시도했다.
그러나 잘 되지않아 결국 다른 사람의 풀이를 참고하게 되었다.
다른풀이
function solution(strings, n) {
// strings 배열
// n 번째 문자열 비교
return strings.sort((s1, s2) => s1[n] === s2[n] ? s1.localeCompare(s2) : s1[n].localeCompare(s2[n]));
}
strings의 n번째 인덱스 값이 같은지 비교하고
같을시)문자열 자체를 비교 // 아닐시)문자열의 n번째 인덱스값을 비교했다.
한줄로 참 깔끔하게 잘 한 풀이인것 같다.
알게된것
1. map에서 중복된 key가 발생하면 나중에 추가된 값으로 덮어씌워진다는 중요한 특성을 알게 되었다.
2. localCompare(): 기존 문자열과 비교해서 비교대상 문자열이 정렬상 전에오는지, 후에 오는지 혹은 같은 순서에 배치되는지 알려주는 숫자를 리턴한다.
'코테' 카테고리의 다른 글
[JS] 점프와 순간 이동 (0) | 2024.06.29 |
---|---|
피보나치 수 런타임 에러 (0) | 2024.06.22 |
JavaScript - 알고리즘 특강(쉽게 진수변환, map & set) (0) | 2024.02.28 |
프로그래머스 JavaScript - 숫자 문자열과 영단어 (0) | 2024.02.22 |
프로그래머스 JavaScript - 이상한 문자 만들기 (0) | 2024.02.05 |