반응형
[처음 푼 풀이]
function solution(strings, n) {
for (let i = 0; i < strings.length; i++) {
let arr = [];
arr += strings[n][i].split();
const result = arr.sort();
return result;
}
}
이번 문제는 생각하는데에 오랜 시간이 걸렸다.
인덱스값을 뽑아서 배열을 만들고 그에 일치하는 단어를 위치에 맞게 다시 정렬해야 하는데.. 생각이 복잡했다.
위의 풀이를 순서대로 풀자면,
1. arr 배열을 담을 변수를 만들고,
2. 빈 배열에 strings[n][i] 로 문자열을 반환받았다.
3. (2)번을 배열에 다시 담아주기 위해 split()을 이용했는데
→ 이 때 드는 의문점 : split() 자체가 배열을 만들어주는데 나는 왜 복합대입연산자를 이용한 것?
여기서 부터 잘못되었음을 인지했다.
4. 마지막으로 만든 배열로 sort()를 이용해 오름차순으로 정리해야하는데, 새로만든 배열이 아니라 원래 배열을 오름차순 정리를 해야함.
→ 혼자 낑낑대도 안되서 구글링을 이용..
[다시 푼 풀이]
function solution(strings, n) {
strings.sort(function (a, b) {
let first = a[n];
let second = b[n];
if (first === second) {
return (a > b) - (b > a);
} else {
return (first > second) - (second > first);
}
});
return strings;
}
1. 변수 first 와 second 는 strings에서 뽑은 단어의 인덱스를 비교해주려고 만든 변수
2. if - else 문으로 비교
1. 이 때 first 와 second의 값이 같다면?
예) strings = ["car", "bar"]
const first = a[1] // "a"
const second = b[1] // "a"
return (a > b) - (b > a) // 직접 a(car) 와 b(bar) 단어를 비교하는 것
따라서, b(ar) 와 c(ar) 를 비교하므로 return 값은 ["bar", "car"]
2. first와 second값이 같지 않다면?
strings = ["sun", "car"]
const first = a[1] // "u"
const second = b[1] // "a"
return (first > second)-(first < second) // first("u") 와 second("a") 비교
따라서, return 값은 ["car", "sun"]
[다른사람의 풀이]
function solution(strings, n) {
return strings.sort((a, b) => {
// 인덱스 n번째 글자를 기준으로 오름차순 정렬
if (a[n] > b[n]) return 1;
else if (a[n] < b[n]) return -1;
// 인덱스 n번째 글자가 같으면 사전순 정렬
else return a > b ? 1 : -1;
});
}
위의 풀이와 비슷한데 위의 것과 합쳐 풀어보자면,
1. 형변환에 의하여 true 는 1 을 반환하고 false 는 0 을 반환한다.
2. 따라서 (first > second) - (second > first) 일 때, 앞의 조건이 true 이면 (1 - 0 = 1) 이고 뒤의 조건이 맞으면 (0 - 1 = -1) 이므로 -1 반환한다.
[리더님의 풀이 조언]
function solution(strings, n) {
strings.sort((a, b) => {
if (a[n] === b[n]) {
return (a > b) - (b > a);
}
return (a[n] > b[n]) - (b[n] > a[n]);
});
return strings;
}
1. first, second 는 재할당 하지 않기 때문에 const로 선언할 것.
2. sort()같은 자바스크립트 고차함수의 인자로 들어가는 콜백함수는 함수 선언문보다 [화살표 함수]가 더 좋다! (this 바인딩 문제와 관련)
3. a[n]과 b[n]은 따로 변수 할당 하지 않아도 될 듯. 오히려 코드가 길어지고 a와 b가 붕 떠보임.
+ [리더님의 풀이]
function solution(strings, n) {
return strings.sort(compareFunction);
function compareFunction(a, b) {
return a[n] === b[n] ? a.localeCompare(b) : a[n].localeCompare(b[n]);
}
}
/**
* (풀이)
* localCompare 메서드는 인수로 지정된 문자열이 정렬상 string 객체의 문자열 뒤에 있으면 음수,
그 반대의 경우는 양수, 동등한 경우 0을 반환한다.
* 이를 이용해서, sort 메서드는 인자로 들어가는 콜백함수 반환 값에 따라서 정렬이 결정되기 때문에
localCompare의 결과를 반환한다.
* 단, a[n] === b[n]이라면 a와 b를 비교해서 정렬하고, 다르면 a[n]와 b[n]을 비교해서 정렬한다.
*
* ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
* (다른 풀이)
* function solution(strings, n) {
return strings.sort((a, b) => {
if (a[n] < b[n]) return -1;
if (a[n] > b[n]) return 1;
if (a[n] === b[n]) return a < b ? -1 : 1;
return 0;
});
}
* 참고로 sort는 비교할 때 기본적으로 유니코드 포인트를 기반으로 비교한다.
* 즉, a(U+0061), b(U+0062) 이런식인데 만약 둘을 비교하면 b가 클 것이고,
위 풀이 같은 경우에는 b가 클 경우 -1을 반환 하고있다.
* sort의 콜백 함수 compareFunction이 -1을 반환하면, compareFunction의 인자
a, b 중에 a가 더 작다고 판단을 한다.
* 결국 이번 문제는 사전순으로 정렬이기 때문에 유니코드 기준에서 오름차순이 될 것 이고,
이러한 원리를 파악했다면 문제를 쉽게 접근 할 수 있다.
*/
❗️중요❗️기억
//숫자로 이루어진 배열을 오름차순, 내림차순 정렬
arr.sort((a, b) => a - b); // 오름차순
arr.sort((a, b) => b - a); // 내림차순
'코딩 테스트 > Programmers - 1' 카테고리의 다른 글
[JS] 문자열 정수로 만들기 (0) | 2022.08.28 |
---|---|
[JS] 두 개 뽑아서 더하기 (0) | 2022.08.28 |
[JS] 나머지가 1이 되는 수 찾기 (1) | 2022.08.23 |
[JS] 수박수박수박수박수박수? (0) | 2022.08.22 |
[JS] 서울에서 김서방 찾기 (0) | 2022.08.22 |