본문 바로가기
코테

프로그래머스 JavaScript - 문자열 내 마음대로 정렬하기

by 해룸 2024. 3. 8.

문제

문자열로 구성된 리스트 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(): 기존 문자열과 비교해서 비교대상 문자열이 정렬상 전에오는지, 후에 오는지 혹은 같은 순서에 배치되는지 알려주는 숫자를 리턴한다.