안녕하세요. 민쯔입니다.😊
이번에는 "문자열 내 마음대로 정렬하기"문제를 풀어보았는데요.
제가 푼 방식이 너무 별로라서ㅋㅋ
다른 사람 풀이로 써져 있는 걸로 설명해보려고 해요.
이 문제는 조건에 맞게 정렬을 어떻게 하는지에 대한 문제인데
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
아직 확실하게 이해 못 했지만 최대한 이해하려고 노력해야 될 것 같아요...😂
'코딩 > 프로그래머스 코딩테스트' 카테고리의 다른 글
[프로그래머스] 두 정수 사이의 합 (0) | 2022.01.04 |
---|---|
[프로그래머스] 나누어 떨어지는 숫자 배열 (0) | 2021.12.29 |
[프로그래머스] 같은 숫자는 싫어 (0) | 2021.12.28 |
[프로그래머스] 가운데 글자 가져오기 (0) | 2021.12.09 |
[프로그래머스] 비밀지도 (0) | 2021.12.08 |