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

 

문제 설명

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

 

제한조건

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

 

입출력 예

strings n return
["sun", "bed", "car"] 1 ["car", "bed", "sun"]
["abce", "abcd", "cdx"] 2 ["abcd", "abce", "cdx"]

 

입출력 예 설명

입출력 예 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"] 입니다.

 

풀이

function solution(strings, n) {
  // 파라미터로 받은 값을 1차 정렬(sort)하고, 2차 정렬을 한다.
  // 2차 정렬에서는 두 문자열을 비교하는데, 이때 charCodeAt을 사용하면 해당 문자를 아스키코드 숫자로 변환할 수 있다
  // 해당 인덱스 문자의 아스키코드 숫자를 기준으로 비교 후 오름차순으로 2차 정렬을 한다.
  return strings.sort().sort((a,b) => a[n].charCodeAt() - b[n].charCodeAt());
}

// 호출
solution(["sun", "bed", "car"], 1);    // ["car", "bed", "sun"]
solution(["abce", "abcd", "cdx"], 2);  // ["abcd", "abce", "cdx"]

 

결과

 

소감

문자열을 정렬할 때 sort()함수만 사용해도 정렬이 됐지만, 이 문제에서는 원하는대로 정렬되지 않아 방법을 찾다가 charCodeAt()이라는 함수를 알게 되었습니다.

이 함수는 해당 문자를 아스키코드표 번호로 변환시켜주는 함수로 문자의 순서를 비교할 때 앞으로 유용하게 쓰일 것으로 보입니다.

반대로 아스키코드표 번호를 문자로 변환시켜주는 String 객체의 fromCharCode() 함수도 있어서 나중에 아스키코드 문제가 있다면 활용해 볼 생각입니다.

지금까지 문제를 내장된 함수에 너무 의존하는게 아닌가 싶어 원리를 이해하고자 for문과 if문을 활용해 문제를 풀어보았는데,

function solution(strings, n) {
  const result = strings.sort();

  for(let i = 0; i < result.length; i++) {
    for(let j = i + 1; j < result.length; j++) {
      if(result[i][n].charCodeAt() > result[j][n].charCodeAt()) {
        let tmp = result[i];
        result[i] = result[j];
        result[j] = tmp;
      }

    }
  }
  
  return result;
};

solution(["sun", "bed", "car"], 1);
solution(["abce", "abcd", "cdx"], 2);

테스트 케이스에서 실패가 더 많았습니다. (테스트 케이스 중 어느 부분에서 정렬이 안되는지 알면 좋을텐데.. 문제가 비공개라 아쉽습니다)

내장 함수를 활용하지 않고 푸는 연습을 더 해야 기초를 다질 수 있을 것 같습니다.

+ Recent posts