programmers 코딩테스트 : 문자열 내 마음대로 정렬하기

H·2022년 6월 20일
0

Coding Test

목록 보기
25/26

문자열 내 마음대로 정렬하기

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

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


통과한 코드

const strings = ["sun", "bed", "car"];
const n = 1;
function solution(strings, n) {
  return strings.sort((a, b) => {
    if (a[n] === b[n]) return (a > b) - (b > a); 
    return (a[n] > b[n]) - (b[n] > a[n]);
  });
}
console.log(solution(strings, n));

📌 내가 생각한 로직
1. sort()로 내림 차순을 한다.
2. 조건 1. string내 a의 [n]번째 글자와 string내 b의 [n]번째 글자가 동일 한 경우 (a > b) - (b > a)를 한다.

(a > b) - (b > a)
// true - false 일때
    1 - 0 = 1
// false - true 일떄 
    0 - 1 = -1

조건 2 그외의 조건은 (a[n] > b[n]) - (b[n] > a[n])
3. 해당 값 return


sort() 배열 정렬하기
arr.sort([compareFunction])

  • compareFunction이 없다면 배열은 각 요소의 문자열 변환에 따라 각 문자의 유니코드 코드 포인트 값에 따라 정렬됩니다. ( [80,9....]인 경우 숫자는 문자열로 변환 되어 80이 먼저 옴)
  • 반환 값 : 정렬한 배열 ( 기존 배열 복사 X / 기존 배열 정렬 O)
  • compareFunction : 배열 요소는 compare 함수의 반환 값에 따라 정렬
    • compareFunction (a,b) :
      0보다 작은 경우 a가 b보다 우선 (-1) // false
      0을 반환하면 a와 b q변경 없음 (0)
      0보다 큰 경우 b가 a보다 우선 (1) // true
    • a와 b의 특정 쌍이 두개의 인수로 주어지는 경우 : 동일한 값을 반환 (불 일치시 정렬 순서 정의 하지 않음 )

남의 코드

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

📌localeCompare()
localeCompare(compareString)
참조 문자열이 정렬 순서에서 지정된 문자열의 앞이나 뒤에 오는지 또는 지정된 문자열과 동일한지 여부를 나타내는 숫자를 반환합니다.

  • compareString : 비교 대상 문자열
//return 
'str'.localCompare('str'): 0 //동일한 경우 
'a'.localCompare('b') : -1 //음수
'b'.localCompare('a') :  1 // 양수 
profile
🤘 돌머리도 ROCK이다! 🤘

0개의 댓글