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

Creating the dots·2021년 10월 13일
0

Algorithm

목록 보기
25/65
post-custom-banner

프로그래머스

https://programmers.co.kr/learn/courses/30/lessons/12915

나의 풀이

  • strings 배열을 오름차순 정렬시켜 나중에 n번째 글자가 같을때 오름차순으로 정렬할 수 있도록 한다.
  • {"sun":"u", "bed":"e", "car":"a"}로 저장하는 객체를 만든다
  • ["u", "e", "a"]로 저장하는 배열을 만들고 오름차순 정렬한다
  • strings 배열을 반복문 돌면서 n번째 알파벳을 객체와 배열에 저장한다
  • arr 배열과 obj 객체를 이중 반복문으로 돌면서 알파벳과 obj 속성값이 일치하면 결과 배열에 넣어주고 객체에서 삭제시킨다 (삭제시키지 않으면 arr 배열에 똑같은 알파벳이 있을때 반복해서 들어가기 때문)
function solution(strings, n) {
    strings.sort(); //먼저 문자열 배열을 정렬시킨다
    const obj = {}; //문자열과 알파벳 저장하는 객체
    const arr = []; //알파벳 저장하는 배열
    const result = []; 
    for(let i=0;i<strings.length;i++){
        obj[strings[i]] = strings[i][n];
        arr.push(strings[i][n]);
    }
    arr.sort();
    for(let i=0;i<arr.length;i++){
        for(const el in obj){
            if(arr[i]===obj[el]){
                result.push(el);
                delete obj[el];
            }
        }
    }
    return result;
}

다른 사람 풀이 (1)

  • s1.localeCompare(s2); //s1이 s2보다 정렬상 전에 온다면 음수, 후에 온다면 양수, 같다면 0
  • s1[n].localeCompare(s2[n]); //위와 같은 방법으로 s1의 n번째 인덱스값과 2의 n번째 인덱스 값을 비교한다.
function solution(strings, n){
  return strings.sort((s1, s2) => s1[n] === s2[n] ? s1.localeCompare(s2) : s1[n].localeCompare(s2[n]));
}

다른 사람 풀이(2)

  • n번째 글자를 맨 앞에 붙여준다
  • 그 상태로 배열을 정렬시킨다
  • 정렬된 배열의 각 요소의 첫번째 글자를 answers 배열에 push 해주고 리턴시킨다
function solution(strings, n){
  var answer = [];
  for(let i=0; i<strings.length; i++){
    const letter = strings[i][n]; //n번째 글자
    strings[i] = letter + strings[i]; //n번째 글자를 strings[i] 앞에 붙여준다
  }
  strings.sort(); // 요소가 변경된 strings 배열 정렬 ===> 같은 문자로 시작하더라도 그 다음 글자로 비교해서 오름차순으로 정렬됨.
  for(let i=0; i<strings.length; i++){
    strings[i] = strings[i].replace(strings[i][0],""); // 앞에 추가된 문자 배열에 넣어주기
    answers.push(strings[i])
  }
  return answer;
}

다른 사람 풀이(3): 가장 빠름!

  • sort 함수를 사용해 a[n]b[n]을 직접 비교한다
  • localeCompare 함수를 이용하는 것보다 직관적이고 빠르다
function solution(strings, n){
  var answer = [];
  strings.sort((a,b) => {
    if(a[n]>b[n]) return 1
    if(a[n]<b[n]) return -1
    if(a[n]===b[n]){
      if(a>b) return 1;
      if(a<b) return -1;
      return 0
    }
  })
  return strings;
}      

String.prototype.localeCompare()

referenceStr.localeCompare(compareString[, locales[, options]])
기존 문자열과 비교했을때 비교 대상 문자열이 정렬상 전에 오면 음수를, 이후에 오면 양수를, 혹은 같은 순서라면 0을 리턴한다

  • 단, 브라우저와 브라우저 버전에에 따라 리턴값이 -1, 1이 아닐 수도 있으므로 (-2, 2 등) 음수, 양수, 0으로 구분하는 것이 적절하다

String.prototype.replace()

var newStr = str.replace(regexp|substr, newSubstr|function)

  • 교체된 새로운 문자열을 리턴시킨다

첫번째 풀이

프로그래머스의 문제들을 풀면서 고차함수를 잘 활용할 수 있어야 한다는 것이다. 나는 객체와 배열을 만들고 이중반복문을 돌리면서 문제를 해결했는데, 첫번째 풀이를 보니 sortlocaleCompare 함수를 적절히 사용해서 간단히 해결했다. localeCompare 함수는 이 문제를 통해 처음 알게 되었다. sort가 양수, 음수, 0으로 정렬시키므로 localeCompare 함수를 적절히 사용할 수 있었다.

두번째 풀이

sort는 첫번째 문자열이 일치할때 두번째 문자열로 크기를 비교하므로 n번째 인덱스 값을 앞에 붙여주면 처음에는 그 값으로 크기를 비교하고, 일치한다면 원래 첫번째 글자로 비교한다.

세번째 풀이

가장 직관적으로 쉽게 푼 방법같다. a[n]===b[n]인 경우 세가지 경우로 구분해 a와 b 크기를 비교할 수 있다.

profile
어제보다 나은 오늘을 만드는 중
post-custom-banner

0개의 댓글