코딩/프로그래머스 코딩테스트

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

민쯔 2022. 1. 8. 18:20
728x90
반응형

안녕하세요. 민쯔입니다.😊
이번에는 "문자열 내 마음대로 정렬하기"문제를 풀어보았는데요.
제가 푼 방식이 너무 별로라서ㅋㅋ
다른 사람 풀이로 써져 있는 걸로 설명해보려고 해요.

 

이 문제는 조건에 맞게 정렬을 어떻게 하는지에 대한 문제인데
sort에 대해 이해가 있어야 풀 수 있는 문제인 것 같아요.

저처럼 sort에 대해 어중간하게 알면 돌고 돌아서 풀어야 돼요.😅
그래도 sort를 잘 사용한 예와 아닌예를 보여줘야 되니까
제가 푼 방법도 코드로 올리겠습니다.

 

sort() 메서드를 잘 사용하지 못한 예

function solution(strings, n) {
    var answer = [];
        
    strings.sort();
    let alpabes = strings.map(x =>x.charAt(n)).sort();    
    
    for(let i=0; i<alpabes.length; i++){
        for(let j=0; j<strings.length; j++){
            if(strings[j].charAt(n) === alpabes[i]){
                answer.push(strings[j]);                
                strings.splice(j, 1);
                break;
            }
        }
    }
    return answer;
}

요건 굳이 설명 안 해도 될 것 같아서 설명 안 하겠습니다.~

 

sort() 메서드를 잘 사용한 예

function solution(strings, n) {
    strings.sort((a,b)=>{
        if(a[n] > b[n]) return 1;
        if(b[n] > a[n]) return -1;

        if(a > b) return 1;
        if(b > a) return -1;

        return 0;
    });
    return strings;
}

sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다.

일반적으로 배열 안에 숫자로 되어 있는 경우 오름차순, 내림차순일 때 자주 쓰이죠?
sort는 숫자뿐만 아니라 문자도 정렬할 수 있습니다.
그래서 이번 문제에서도 문자를 정렬해야 되는 문제에서도 sort를 사용했습니다.
그럼 sort() 메서드에 대해 자세히 알아야겠죠?

 

sort() 메서드를 쓸 때 일반적으로

  • 배열. sort((a, b) =>{});

로 쓰이는데요.

여기서 a, b는 비교되는 요소라고 생각하시면 되는데,
이렇게만 봐서는 a, b가 무엇인지 잘 모르겠죠?
그래서 콘솔로 찍어보았습니다.

 

sort() 메서드의 매개변수 콘솔로 찍을 때

//테스트 1
// strings = ["sun", "bed", "car"];

//테스트 2
// strings = ["abce", "abcd", "cdx"]

strings.sort((a,b)=>{
	console.log(`a:${a}, b:${b}`);
});
    
// 테스트 1
// a:bed, b:sun
// a:car, b:bed

// 테스트 2
// a:abcd, b:abce
// a:cdx, b:abcd

이렇게 a, b를 넣어주면 차례대로 배열의 원소들을 비교하게 됩니다.

쉽게 설명하면 sort((next, prev)=>{});로 생각하시면 됩니다.


그럼 sort() 메서드 안에 조건을 쓰면 됩니다.

 

sort() 메서드는 비교 함수(Compare Function)를 작성해야 되는데,
이 안에는 1, 0, -1 총 3가지 경우로 나눌 수 있고
일반적으로 조건문과 매개변수의 비교를 사용합니다.

  • 1 : 0보다 클 때
    • a가 먼저
  • 0 : 0일 때
    • 그대로
  • -1 : 0보다 작을 때
    • b가 먼저

 

strings.sort((a,b)=>{
	if(b > a) return -1; //오름차순
});
console.log(strings);
// 테스트 1 [ 'bed', 'car', 'sun' ]
// 테스트 2 [ 'abcd', 'abce', 'cdx' ]

이전 엘리먼트(b)가 이후 엘리먼트(a) 보다 크면 순서를 바꾸기 때문에 결국 오름차순으로 정렬

 

그래서 위에 있는 예제를 사용해서 여기서 조건인

  • 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다.
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전 순으로 앞선 문자열이 앞쪽에 위치합니다.

이 두 가지를 맞춰서 코드를 작성하자면,

 

  • 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다.
    • if(b [n] > a [n]) return -1; //오름차순
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전 순으로 앞선 문자열이 앞쪽에 위치합니다.
    • if(a > b) return 1; //오름차순

이렇게 됩니다.

 

사실

strings.sort((a,b)=>{
	if(b[n] > a[n]) return -1;
	if(b > a) return -1;
 });

이렇게만 써도 답은 맞긴 하는데
제출 후 채점하기에서 모든 테스트에서 오답이 나오더라고요.

이해는 잘 안 되지만 1일 경우, 0일 경우, -1일 경우 다 써야지만 제출 후 채점하기에서도 통과가 되는 것 같습니다.

그래서

  • 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다.
    • if(b [n] > a [n]) return -1; //오름차순
    • if(a [n] > b [n]) return 1; //콘솔에서는 아무것도 안 바뀌고 그대로 출력
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전 순으로 앞선 문자열이 앞쪽에 위치합니다.
    • if(b > a) return -1; //오름차순
    • if(a > b) return 1; //콘솔에서는 아무것도 안 바뀌고 그대로 출력

 

sort에 대한 설명은 아래 링크를 많이 참고해서 썼습니다.👇
https://velog.io/@jakeseo_me/Javascript-Sort%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9E%A1%EC%A7%80%EC%8B%9D

 

Javascript Sort함수에 대한 잡지식

javascript sort 함수는 당신이 원하는대로 동작하지 않을 것이다. (만일 당신이 비교 함수를 작성하지 않는다면)

velog.io

아직 확실하게 이해 못 했지만 최대한 이해하려고 노력해야 될 것 같아요...😂

728x90
반응형