[프로그래머스 1레벨] 문자열 내 마음대로 정렬하기

이민선(Jasmine)·2022년 12월 21일
1
post-thumbnail

나의 코드

function solution(strings, n) {
  const sorted = strings.map((v)=>v[n]+v).sort()
  return res = sorted.map((i)=>i.split('').splice(1).join(''));  }

sort()를 쓰면 각 단어 첫 글자의 a,b,c 순서대로 정렬이 된다는 점을 이용했다. n번째 알파벳을 기존 원소에 턱 붙인 새로운 원소로 map 적용하고, sort()로 정렬.
정렬이 된 다음 각 원소의 앞 글자를 splice(1)로 제거한 배열을 다시 map을 뽑아냈다.

sort()가 문자열을 a,b,c 순으로 정렬한다는 점을 이용했다는 것은 좋았지만, sort의 원리를 정확히 모르고 계속 사용하고 있었다는 점이 마음 한 켠에 불-편함으로 남아있었다. sort의 원리도 제대로숙지 못하고 내림차순, 오름차순만 사용하는 건 너무 1차원적이지 않은가 나 자신? 그래서 이번 기회에 좀 더 파보았다.

sort

sort((a,b)=>a-b)

에서 a-b가 도대체 무슨 의미냐면,
⭐️a-b가 양수이면 a,b 두 원소의 자리를 바꿔야하고, a-b가 음수이면 정렬된 상태라는 뜻이다.(왜 음수일 때 편안한거야 난 양수가 더 편안한데)

그래서 a-b는 왼쪽에 있는 원소가 오른쪽에 있는 원소보다 작은 상태가 되어서 오름차순,
b-a는 오른쪽에 있는 원소가 왼쪽에 있는 원소보가 작은 상태여서 내림차순 정렬이 되는 것이다.

기본적인 원리는 와닿은 것 같으니 이 문제를 localeCompare라는 메소드로 다시 풀어보았다. sort와 더 가까워질 수 있다.

우선 localeCompare가 익숙치 않으니 먼저 조금 훑자면,

localeCompare

// "a"는 "c" 전에 위치하므로 음수 값을 반환
'a'.localeCompare('c'); // -2 혹은 -1 (또는 다른 음수 값)

// 알파벳 순으로 단어 "check"는 "against"보다 뒤에 위치하므로 양수 값을 반환
'check'.localeCompare('against'); // 2 혹은 1 (또는 다른 양수 값)

// "a"와 "a"는 서로 동등하므로 중립 값 0을 반환
'a'.localeCompare('a'); // 0

🍄주의: -1 또는 1의 정확한 반환 값에 의존하지 마세요.

음의 정수와 양의 정수의 결과는 브라우저마다(브라우저 버전에 따라서도) 다릅니다.이는 W3C 사양에서는 음의 값과 양의 값만 필요하기 때문입니다. 브라우저에 따라서는, -2나 2를 반환하거나, 그 외의 음의 값이나 양의 값을 반환할 수도 있습니다.🍄

MDN 참고:
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare

두 가지 문자열을 비교해서 양수 또는 음수를 반환하는 메소드이다.

그렇다면 오늘의 문자열 정렬 문제는 sort와 localeCompare를 이용해서 이렇게 코드를 작성할 수도 있다.

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

예를 들어, ["abce", "abcd", "cdx"]라는 배열과 n=2가 주어졌다고 하자.

우선 sort 안에서 a와 b 두 가지 element의 n번째 알파벳을 비교한다.
(1) abce와 abcd는 2번째 알파벳이 "c"로 같다. 이럴 경우에는 "abce".localeCompare("abcd")가 양수이다. sort는 양수이면 자리를 바꾸기 때문에 abce와 abcd는 자리를 바꾼다.

(2) 그렇다면 2번째 알파벳이 다른 "abce"와 "cdx"는 어떨까? 각각 "c"와 "x"이므로
"c".localeCompare("x")는 음수이다. sort님에게는 편-안한 상태이므로 둘의 자리를 바꾸지 않는다.

그래서 이러한 원리를 반복하면
["abcd", "abce", "cdx"]
로 정렬이 되는 것이다.

이로써 sort와 localeCompare와 조금 더 친해졌다!
좀만 쉬고 알고리즘 풀러 슝쓩가야쥐

profile
기록에 진심인 개발자 🌿

0개의 댓글