(javascript) - Lv1 : 문자열 내 맘대로 정렬하기

문제 설명

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다.

예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.

 

제한 조건
  • strings는 길이 1 이상, 50이하인 배열입니다.
  • strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
  • strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
  • 모든 strings의 원소의 길이는 n보다 큽니다.
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.

 

입출력 예

 

  • 입출력 예 1

"sun", "bed", "car"의 1번째 인덱스 값은 각각 "u", "e", "a" 입니다. 이를 기준으로 strings를 정렬하면 ["car", "bed", "sun"] 입니다.

 

  • 입출력 예 2

"abce"와 "abcd", "cdx"의 2번째 인덱스 값은 "c", "c", "x"입니다. 따라서 정렬 후에는 "cdx"가 가장 뒤에 위치합니다. "abce"와 "abcd"는 사전순으로 정렬하면 "abcd"가 우선하므로, 답은 ["abcd", "abce", "cdx"] 입니다.

 


이 문제를 풀기 위해서

이 문제를 풀기 위해 sort() 함수에 대한 개념이 필요합니다.

전 기본적으로 많이사용하는

오름차순 : sort((a, b) => a - b)

내림차순 :  sort((a, b) => b - a)

이런식으로만 사용했지만 

 

이 문제를 위해선 sort 에 대해 깊이 있게 아는 것이 필요했습니다.

 

sort 함수를 사용할 때 기본적으로 배열.sort((a, b) => {}); 이런 식으로 사용하는데

이렇게만 봐서는 a가 무엇을 뜻하는지, b가 무엇을 뜻하는지 알 수 없습니다.

a가 무엇이고 b가 무엇인지 설명하자면 다음과 같습니다.

sort((next, prev)=>{});

배열이 ["dog", "cat", "bird"] 라면, sort를 적용했을 때, a와 b를 다음과 같이 확인하면

let animals = ["dog", "cat", "bird"];

animals.sort((a, b) => {
	console.log(`a는 : ${a} 입니다., b는 :${b}` 입니다.);
});

 

출력결과는 다음과 같습니다.

a는 : cat 입니다., b는 :dog 입니다.
a는 : bird 입니다., b는 :cat 입니다.

 

이 처럼, next(다음) 요소인 "cat" 과 prev(이전) 요소인 "dog"를 비교하고 배열의 끝까지 차례대로 비교하게 됩니다.

 

sort의 배열의 요소가 오름차순인지, 내림차순인지는 배열의 요소를 비교하여 나오는 반환값에 따라 결정되는데, a 와 b를 비교시 

만약 a > b ( a가 b 보다 크다면 ) return 1 // 내림차순 : sort((a, b) => b - a)
만약 a < b ( b가 a보다 크다면 ) return -1  // 오름차순 : sort((a, b) => a - b)
만약 a === b ( a와 b가 같다면 )  return 0

이렇게 요소를 비교하여, 반환값에 따라 내림차순, 오름차순이 결정됩니다.

 

이제 문제의 코드를 보며 문제를 이해해봅시다.

 


solution.js

function solution(strings, n) {
    return strings.sort((a, b) => {
        // a[n]이 b[n]보다 크면 1을 반환하고 // 내림차순
      if (a[n] > b[n]) return 1;

        // a[n]이 b[n]보다 작으면 -1을 반환하고 // 오름차순
      else if (a[n] < b[n]) return -1;

        // a[n]이 b[n]과 같으면 사전순으로 정렬한다.
      else return a > b ? 1 : -1;
    });
  }

1. strings 배열의 요소들을 비교합니다.

 

2. strings 배열의 문자열의 n번째 값들을 비교합니다

strings가 ["sun", "bed", "car"] 이고, n = 1 이므로
next 요소인 "bed"의 e와, prev 요소인 "sun" 의 u 와 비교합니다.
( a[n] > b[n] ) e는 u 보다 크므로 1을 반환합니다. 내림차순 ["bed", "sun"]

next 요소인 "car"의 a와, prev 요소인 "bed" 의 e 와 비교 
( a[n] > b[n]) a는 e 보다 크므로 1을 반환합니다. 내림차순 ["car", "bed", "sun"]
 

3. 만약 strings 배열의 문자열의 n번째 값이 같다면, 사전순으로 정렬합니다.