(알고리즘) Programmers : 문자열 내 마음대로 정렬하기

호두파파·2021년 2월 15일
0

알고리즘 연습

목록 보기
1/60
post-thumbnail

문자열로 구성된 리스트 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] 입니다.


문제 풀이

해당 문제는 2가지 방식으로 풀이가 가능하다.

  • 내장함수 localeCompare()를 이용한 기준 정렬하기
  • 내장함수 sorting()의 기본원리를 이용하기

localCompare
해당 메서드는 기준 문자열과 비교했을 때 비교 대상 문자열이 정렬상 전에 오는지, 후에 오는지 같은 순서에 배치되는지를 알려주는 숫자를 리턴한다.

String.prototype.localeCompare
referenceStr.localeCompare(compareString[, locales[, options]])

localeCompare를 활용한 문제 풀이

function solution(strings, n) {
  return strings.sort((a, b) => a[n] === b[n] ? a.localeCompare(b) : a[n].localeCompare(b[n])); }

n번째 알파멧이 같으면, a와 b를 비교하고 그렇지 않을 경우 a[n]과 b[n]을 비교하여 숫자를 리턴한다.

sort만을 활용한 풀이

sort()를 활용한 문제풀이
비교 함수는 배열 안에 인접한 요소를 비교하는 역할이다. 비교함수는 인수를 두개로 받는다. 첫 번째 인수는 인접한 왼쪽 요소이고, 두 번째 인수는 인접한 오른쪽 요소이다.

비교함수를 function(a,b)라고 했을 때 비교 함수는 다음 규칙을 따른다.

  • function(a,b) < 0 이면 a를 b보다 작은 인덱스로 정렬한다.
  • function(a,b) === 0 이면 a와 b의 순서를 바꾸지 않는다.
  • function(a,b) > 0 이면 b를 a보다 작은 인덱스로 정렬한다.

n번째 문자가 같을 때는 return (a > b) - (a < b);매개변수로 받은 a,b 문자열 전체를 비교하면 해결할 수 있다.

function solution(strings, n) {
    strings.sort((a,b) => {
        const first = a[n];
        const second = b[n];
        if (first === second){
            return (a > b) - (a < b);
        } else {
            return (first > second) - (first < second);
        }
    });
    return strings;
}
profile
안녕하세요 주니어 프론트엔드 개발자 양윤성입니다.

0개의 댓글