🔻 문자열 내 마음대로 정렬하기
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
strings n return ["sun", "bed", "car"] 1 ["car", "bed", "sun"] ["abce", "abcd", "cdx"] 2 ["abcd", "abce", "cdx"]
👀
난... 정말... 바본가.......
sort를 써야할 것 같아서 특정 문자 기준으로 정렬하기를 시도해보았지만, 잘 되지 않아서 dictionary를 써서 key와 value값으로 접근했다. 쉽게 풀 수 있는 문제를 돌아돌아 접근한 것 같다..
sort의 내부 원리에 대해서 공부 했는데 사용하질 못한 것 같아서... 넘나 아쉽...😇
function solution(strings, n) {
// 미리 사전순 정렬
let sorted_string = strings.sort();
// 문자 : 기준 문자열 map 생성
let map = {};
sorted_string.forEach(v => {
map[v] = v[n];
})
let answer = [];
// 기준값을 오름차순으로 정렬
let values = Object.values(map).sort();
let keys = Object.keys(map);
// value로 key 찾기
for (let i = 0; i<strings.length; i++) {
let key = keys.find(key => map[key] === values[i]);
answer.push(key);
// 중복 방지
delete map[key];
}
return answer;
}
let 코드필요시삽입
function solution(strings, n) {
// strings 배열
// n 번째 문자열 비교
return strings.sort((s1, s2) => s1[n] === s2[n] ? s1.localeCompare(s2) : s1[n].localeCompare(s2[n]));
}
기준 문자열과 비교했을 때 비교 대상 문자열이 정렬상 전에 오는지, 후에 오는지, 혹은 같은 순서에 배치되는지를 알려주는 숫자를 리턴한다.
'a'.localeCompare('c'); // -1
'c'.localeCompare('a'); // 1
'a'.localeCompare('a'); // 0
비교 문자열 < 비교 대상 문자열 return -1
비교 문자열 > 비교 대상 문자열 return 1
비교 문자열 = 비교 대상 문자열 return 0
sort()에서는 compareFunction이 주어지지 않으면 요소를 문자열로 변환하고 유니코드 포인트 순서로 문자열을 비교해서 정렬한다.
compareFunction이 주어지는 경우 compare함수의 반환값에 따라 정렬된다.
const numbers=[0,5,4,1,2];
numbers.sort((a,b)=>a-b); //오름차순
numbers.sort((a,b)=>b-a); //내림차순
반환값 < 0인 경우 a가 b보다 앞에 있어야 함
반환값 > 0인 경우 b가 a보다 앞에 있어야 함
반환값 = 0인 경우 순서를 바꾸지 않는다