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

ppyororong_0_0·2022년 1월 19일
0

프로그래머스

목록 보기
19/19

[프로그래머스 - 1단계] 문자열 내 마음대로 정렬하기 문제

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

📝 문제 설명

문자열로 구성된 리스트 strings와 정수 n이 주어졌을 때,
각 문자열의 인덱스 n번째 글자를 기준으로 strings를 오름차순 정렬.

  • 조건 : n번째 인덱스의 문자가 같은 문자열이 여럿 일 경우,
    사전순으로 앞선 문자열이 앞쪽에 위치.

💡 풀이

1. 우선 조건 부분을 해결하기 위해 sort( ) 함수를 사용하여 문자열들을 사전순으로 정렬해주었다.

2. 사전순으로 정렬된 strings를 n번째 문자의 아스키코드끼리 비교하여 또 한 번 정렬해주었다.

🖥️ 코드

function solution(strings, n) {
    return strings.sort().sort((a, b) => {
        return a[n].charCodeAt() - b[n].charCodeAt(); 
    });
}
  • 처음에는 먼저 문자열 전체를 기준으로 하여 사전순으로 정렬하지 않고 코드를 짰었다.
  • sort( ) 함수 내에 조건문을 주어서 n번째 문자가 같으면 사전순으로 앞선 문자열이 앞에 위치하도록 하였는데 이렇게 하니 다른 결과가 나왔다.
  • 그래서 sort( ) 내부에 console.log(strings)를 넣어 출력해보았다.
  • 그런데 strings가 바뀌면서 출력될 것이란 기대와는 달리 정렬하기 전의 strings가 계속해서 출력되었다.
  • 어디가 틀렸는지 원인을 알 수 없어 계산되는 횟수를 출력해 보았는데 내가 예상했던 것보다 많이 나왔다.
  • 그래서 그 다음으로는 console.log(a[n], b[n], strings, a, b)를 하여 console.log( )안에 눈에 보이는 건 전체 다 넣어서 출력해보았다.
  • 확실하게 알 수는 없지만 a와 b는 자리가 바뀌기 전 strings내 이웃해 있는 a와 b끼리 비교를 한 번 하고 또 바뀐 후의 이웃해있는 요소들끼리도 서로 비교를 해가며 제자리를 찾아가는 듯하다.
  • 그래서 처음부터 문자열 전체를 기준으로 하여 사전순으로 정렬을 해놓고 난 뒤,
    n번째 문자끼리 비교하여 문자열들을 재정렬 하였다.

❗ 다른 사람 풀이

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

localeCompare( ) 이라는 함수를 처음 봐서 가지고 왔다.

[ localeCompare( ) ]

  • 용도
    : 정렬했을 때 비교 대상 문자열이 기준 문자열보다 앞에 와야 하는지, 뒤에 와야 하는지, 같은 순서에 배치 되어야 하는지를 나타내는 숫자 반환.

  • 주의 : 리턴되는 값은 브라우저마다 다를 수 있다.

  • 문법
    기준 문자열.localeCompare(비교 대상 문자열)
'bed'.localeCompare('sun')  // -2 or -1 (아니면 다른 음수값)
'sun'.localeCompare('bed')  // 2 or 1 (아니면 다른 양수값)
'bed'.localeCompare('bed')  // 0
  • 예시 설명 (1)
'bed'.localeCompare('sun') // -1

기준 문자열('bed')과 비교 대상 문자열('sun')을 비교했을 때 음수가 나온다면,
비교 대상 문자열 'sun'의 순서가 더 뒤쪽에 온다.

  • 예시 설명 (2)
'sun'.localeCompare('bed')  // 1

기준 문자열('sun')과 비교 대상 문자열('bed')을 비교했을 때 양수가 나온다면,
비교 대상 문자열 'bed'의 순서가 더 앞쪽에 온다.

참조 사이트 바로가기

[ sort( ) 의 return값 ]

  • return값이 음수 : s1이 앞에 오도록, s2가 뒤에 오도록 자리 바꿈
  • return값이 양수 : s2가 앞에 오도록, s1이 뒤에 오도록 자리 바꿈
  • return값이 0 : 자리 변경 없음
profile
안녕하세요!

0개의 댓글