문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
입출력 예 1
"sun", "bed", "car"의 1번째 인덱스 값은 각각 "u", "e", "a" 입니다. 이를 기준으로 strings를 정렬하면 ["car", "bed", "sun"] 입니다.
입출력 예 2
"abce"와 "abcd", "cdx"의 2번째 인덱스 값은 "c", "c", "x"입니다. 따라서 정렬 후에는 "cdx"가 가장 뒤에 위치합니다. "abce"와 "abcd"는 사전순으로 정렬하면 "abcd"가 우선하므로, 답은 ["abcd", "abce", "cdx"] 입니다.
27103
function solution(strings, n) {
let result = [];
//해쉬 데이터를 뽑아내는 것에서 아이디어를 얻었다.
// 1. map함수를 사용하여 해당 배열의 문자열의 문자를 추출하고 이것을 '='으로 연결하였다.
// 2. sort를 사용하여 문자를 정렬하였다. 당근 추출했던 한개의 문자가 앞에오니 그것을 기준으로 정렬이 된다.
// 3. 다시 map을 사용하여 =을 분리하여 2차원배열로 만들었다.
// 4. 2차원으로 분리된 배열을 forEach로 반복시켜서 result에 새롭게 담는데 이때 element의 2번째 배열의 값들을 넣으면 된다.(['a','car']) 중 2번째 인덱스 value
// 5. result를 return 하였다. result를 사용하기 전에 저장공간을 만드는 것을 잊지말자 ㅎ
const string = strings.map((value) => value = `${value.charAt(n)}=${value}`).sort().map((value) => value = value.split('='))
string.forEach((element,index) => {result[index] = element[1]});
return result
}
역시 남의 떡이 더 커보였던가 이 코드가 나의 코드보다 효율적이고 잘 정렬된 코드인것은 자명한 사실이다.
또한 역설적으로 나의 코드는 오류가 있다. 바로 추출한 문자열끼리만 비교하여 값을 만들어 냈다는 것이다.
운이 좋아서 코드가 통과하지만 오류검사기능을 확장시키면 오류가 발생할 것이다.
아래의 코드는 직관적으로 loacaleCompare APIs를 사용하여 값을 비교하였으며 또한 추출한 문자열 뿐만아니라 추출한 문자가 같을때도 비교함으로써 정확성을 높였다.
훌륭한 코드이다. 보고 배우도록 하자!
function solution(strings, n) {
// strings 배열
// n 번째 문자열 비교
//바로 배열을 정렬한다... 와우!!
// sort의 정렬 방식을 localCompare를 이용하여 정렬한다.
// s1과 s2는 배열에서 정렬하기 위한 2개의 값이다.
// s1[n] 은 배열의 value에 대한 문자열의 n번째 값이다. ex) s1 = car n = 1 >> a를 의미한다.
// s1[n]과 s2[n]이 같으면, 즉 추출한 값이 같다면, 다음과 같이 정의한다.
//s1.localeCompare(s2) 이말은 s1의 값이 s2보다 먼저이면 -1을 리턴하고 s2의 값이 먼저이면 1을 리턴한다. (오름차순이 되어야 함으로 -1이 리턴해야 한다. // a, b => a-b 인것은 -1을 리턴하기에 b가 더 뒤에 오도록 정렬시키는 것임 )
// 같지 않다면 s1의 추출한 문자와 s2의 추출한 문자끼리 비교한다.(ex car의 a 와 bed의 e, a와 e 끼리 비교하여 정렬 시키는 것임.)
//굉장한 프로그래밍 기간을 경험해야 이정도 나오는 듯 하다 후..
return strings.sort((s1, s2) => s1[n] === s2[n] ? s1.localeCompare(s2) : s1[n].localeCompare(s2[n]));
}
localeComapre() 짚고가기
먼저 sort가 어떻게 배열을 정렬하는지 잠시 훑어보자
sort는 다음과 같이 표현한다.
a는 작은 수 b는 큰 수이다.
이때 첫번째 오름 차순은 - 값이 나오게 되어 b가 나중에 정렬된다. 반면에 두번째 내림 차순은 +가 나옴으로 a가 뒤에 있는 내림으로 정렬된다.sort((a,b) => a - b) // 오름 차순 sort((a,b) => b - a) //내림 차순
위와 같은 개념으로 -1은 오름차순, +1은 내림차순을 기억하면 localeComapre()를 이해하기 쉽다.
문자열을 직접 비교할 때 사용할 수 있는데 아래와 같다.'a'.localeCompare('b') // 이 값은 a가 b보다 앞에 있고 순서는 더 작으니 -1를 리턴한다. 'b'.localeCompare('a') // 이 값은 b가 a보다 뒤에 있고 순서는 더크니 +1를 리턴한다.
이 처럼 문자를 직접 비교할 수 있고 sort에 콜백함수로 넣어 사용 할 수 있다.
앞으로 문자를 비교할 때 유용하게 사용 할 수 있을 것 같아 설렌다.