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

angie·2022년 12월 13일
0
post-thumbnail
post-custom-banner

🎯 문제

문제 설명

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

제한사항

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

🔠 내 풀이

function solution(strings, n) {
  strings.sort((a, b) => {
    if (a[n] === b[n]) {
      // 문자열 비교 == 사전순 비교
      if (a > b) return 1
      else if (a < b) return -1
    } else {
      return a.charCodeAt(n) - b.charCodeAt(n)
    }
  })
  return strings
}

sort()함수를 사용하여 정렬 순서를 정의하는 함수를 사용했다.

풀이 방법

1. sort()

compareFunction이 제공되면 배열 요소는 compare 함수의 반환 값에 따라 정렬됩니다.

  • 음수를 반환할 때 : a < b로 정렬
  • 양수를 반환할 때 : b < a로 정렬
  • 0을 반환할 때 : a = b (정렬 순서가 정의되지 않음)
// 오름차순으로 정렬
array.sort((a, b) => a - b)
array.sort((a, b) => b - a)

객체의 속성 중 하나의 값을 기준으로 정렬할 수 있다.

var items = [
  { name: 'Edward', value: 21 },
  { name: 'Sharpe', value: 37 },
  { name: 'And', value: 45 },
  { name: 'The', value: -12 },
  { name: 'Magnetic', value: 13 },
  { name: 'Zeros', value: 37 }
];

// value 기준으로 정렬
items.sort(function (a, b) {
  if (a.value > b.value) {
    return 1;
  }
  if (a.value < b.value) {
    return -1;
  }
  // a must be equal to b
  return 0;
});

2. 문자열 비교

문자열에 비교 연산자 (<, >)를 사용하면 두 문자열을 '사전 순서'대로 비교한다. (문자열의 ASCII 값을 비교)

('apple' > 'banana'); // false
('apple' > 'abcd'); // true
('apple' > 'a'); //true
('apple' > 'Banana'); // true
('apple' > '1'); // true

💡 다른 풀이

1.

function solution(strings, n) {
    // n 번째 문자열 비교
    return strings.sort((s1, s2) => s1[n] === s2[n] ? s1.localeCompare(s2) : s1[n].localeCompare(s2[n]));
}

localeCampare()

localeCompare() 메서드는 참조 문자열이 정렬 순으로 지정된 문자열 앞 혹은 뒤에 오는지 또는 동일한 문자열인지 나타내는 수치를 반환합니다.

referenceStr.localeCampare(compareString)

compareString 전에 referenceStr가 위치하는 경우 음수, compareString 후에 referenceStr가 위치하는 경우 양수, 동등할 경우 0이 됩니다.

  • referenceStr === sort에서 a
  • compareString === sort에서 b

2.

function solution(strings, n) {
    return strings.sort((a, b) => {
        const chr1 = a.charAt(n);
        const chr2 = b.charAt(n);

        if (chr1 == chr2) {
            return (a > b) - (a < b);
        } else {
            return (chr1 > chr2) - (chr1 < chr2);
        }
    })
}

sort에 인자로 전달된 함수는 문자열 비교구문을 사용하여 bool값을 연산한 값을 리턴한다. (a > b의 구문은 true, false의 bool값으로 평가됨)

profile
better than more
post-custom-banner

0개의 댓글