728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/12915?language=javascript 

 

코딩테스트 연습 - 문자열 내 마음대로 정렬하기

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱

programmers.co.kr

 

코드


  • 나의 풀이
    function solution(strings, n) {
        return strings.sort((str1, str2) => 
            str1[n] === str2[n] ? str1.localeCompare(str2) : str1[n].localeCompare(str2[n])
        );
    }​

 

  • 다른 분의 풀이
    function solution(strings, n) {
        return strings.map(a=>[...a][n]+a).sort().map(a=>a.substring(1));
    }​

 

후기


  • 문제 이해 : strings의 각 str에 n번째 인덱스를 기준으로 오름차순하고, 해당 인덱스가 같은 경우에는 str을 기준으로 오름차순하기
  • 처음에는 strings.sort()를 통해 인덱스가 같은 경우에 대해 미리 처리하자는 방법으로 접근을 했으나 그 후에 인덱스에 따른 sort를 못하겠더라.. 그래서 검색을 통해 localeCompare() 이라는 매력적인 함수에 대해 알게 되었다
  • localeCompare() : 두 문자열을 비교하여 정렬상 어떤 문자열인지 알 수 있는 함수로, 기본 사용법은 str1.localeCompare(str2) 이며 음수, 양수, 0 셋 중에 하나의 값을 return하게 된다
    1. 음수 return : str1이 str2보다 정렬상 앞에 오는 경우
    2. 양수 return : str1이 str2보다 정렬상 뒤에 오는 경우
    3. 0 return : str1과 str2가 같은 경우
  • localeCompare()함수와 자바스크립트 sort()함수의 sort()의 매개변수로 오는 함수가 true인 경우에 정렬된다는 성질을 이용하면 간단한 풀이가 나올 수 있다
  • 하지만 나의 풀이는 생소한 localeCompare()를 썼기 때문에 직관적이지 않다는 단점이 있고, 다른 분의 풀이를 보니 map과 sort만 이용하여 간단한 풀이를 하였다. 저 분의 풀이를 보면 기존 strings 앞에 n번째 인덱스의 문자열을 붙이고 그에 따라 정렬을 한 후 substring()함수로 맨 앞에 인덱스를 떼어주는 풀이이다. 아주 신박했다!

+ Recent posts