본문 바로가기
알고리즘 스터디/프로그래머스 스킬체크 레벨 1(끝)

[프로그래머스 스킬체크 레벨 1] 문자열 내 마음대로 정렬하기 문제 풀이 및 설명 - 자바스크립트[JAVASCRIPT]

by 레일라오리덕 2021. 5. 3.
728x90

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

 

코딩테스트 연습 - 문자열 내 마음대로 정렬하기

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

programmers.co.kr

문제

 

문자열로 구성된 리스트 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"]

 

기본 제공 틀

 

function solution(strings, n) {
    var answer = [];
    return answer;
}

 

풀이 [JavaScript]

 

안녕하세요, 오늘은 프로그래머스 스킬체크 레벨 1의 문제인 문자열 내 마음대로 정렬하기 문제를 풀이해보도록 하겠습니다. 

이번 문제는 정렬이 가장 중요한 핵심인데요.

문제에서는 오름차순으로 정렬을 하라고 명시해놓았습니다.

 

우선 정렬의 기본적인 개념부터 이해를 해야하는데요.

a와 b값을 비교하여 값이 1(true, 양수값)이면 a가 b보다 값이 크다는 것이므로 둘의 자리를 바꿔야지 오름차순이 됩니다. (예: a=5, b=1)

반대로, a와 b값을 비교하여 값이 -1(false, 음수값)이면 a가 b보다 값이 작다는 것이므로 둘의 자리를 바꾸지 않아도 됩니다. (예: a=1, b=5)

a와 b와 값을 비교하여 0인경우 값이 같다는 뜻이므로 자리를 바꾸지 않아도 됩니다. (예: a=1, b=1)

 

그래서 아래는 chr1과 chr2에 strings에 있는 임의의 값의 n번째 자리의 글자를 담아주고(a.charAt(n), b.charAt(n)), 만약에 둘의 값이 같다면, n번째 자리를 기준으로 오름차순이 아닌 해당 문자열을 기준으로 정렬을 해주어야하기 때문에, chartAt으로 n번째 자리의 값을 뽑아내지 않고 strings 배열에 있는 문자열 그대로를 비교하여 ((a > b) - (a < b)) 결과값을 return 해 줍니다.

 

여기서 결과값이란, 예를 들어, a가 b보다 큰 경우라면, (a > b)가 양수 값일 것이고, (a < b)는 음수값일 것입니다. 양수값에서 음수값을 빼면 양수값이 나올 것이고 이 경우에는 앞서 설명했듯이, 둘의 자리를 바꿔야지 오름차순이 되는 것입니다.

 

반대로 a가 b보다 작은 경우라면, 음수값이 나올것이고 음수 값이 return되면 둘의 자리가 바뀌지 않을 것입니다. (오름차순이어야 하기때문에)

혹은 a와 b가 같은 경우라면, 0이 나올 것이고 둘의 자리는 바뀌지 않을 것입니다.

 

그리고 n번째 자리의 값이 같지 않은 경우라면, n번째 자리의 값을 기준으로 정렬해주어야하기 때문에, chr1과 chr2값을 위에서 설명했듯이 비교해서 양수 혹은 음수또는 0 값을 반환하게 로직을 짜놓았습니다.

 

728x90

 

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);
        }
    })
}

 

아래는 다른사람의 풀이입니다.

 

아래의 풀이는 localeCompare함수로 간단하게 푼 풀이입니다.

localCompare함수는 s1이 s2보다 작으면 음수값을, s1이 s2보다 크면 양수값을, s1과 s2의 값이 같으면 0을 반환하는 함수입니다.

아래에서는 만약, strings배열의 임의의 문자열 s1, s2의 n번째 값이 같다면 n번째 값이 아닌 s1, s2의 값을 비교해서 반환하도록하고, 같지 않다면 n번재 문자를 비교하여 반환하도록 로직을 짜놓았습니다.

위의 풀이가 이해가 되셨다면 이 풀이가 이해가 쉬울 것입니다.

다른 점은 다항연산자를 썼다는 점입니다.

혹시 이해가 되지 않으신다면 댓글 남겨주세요! :D

 

 

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

 

채점 결과 [JavaScript]

 

728x90

댓글