TIL

2024.01.02 TIL #오름차순 #sort #replace(a,b)

inz1234 2024. 1. 2. 22:26

예제 1

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

제한조건

  • strings는 길이 1 이상, 50이하인 배열입니다.
  • strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
  • strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
  • 모든 strings의 원소의 길이는 n보다 큽니다.
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.

arr. sort(   ) 함수

- arr 배열 내의 기존 요소들이 오름차순으로 정렬되어 다시 "배열"로 반환되게 하는 함수

- 기본적으로 모든 요소를 "문자열"로 간주

- But, 숫자도 2와 92가 있다면 앞자리만 보고 92 < 2 가 됨

-  따라서 compareFunction 을 인수로 받아

   arr. sort(compareFunction) 으로 숫자 비교 가능 (콜백함수)

 

arr. sort(a,b) {  

if ( a > b )  {

return 1;                                            // (a - b > 0)  

} if ( a === b ) {

return 0;                                           // (a - b = 0) 

} if ( a < b) {

return -1;                                          // (a - b < 0) 

}

 

- > 1    return 시 오름차순으로(큰 값이 뒤로)

-> 0     return 시 위치가 변경되지 않음

-> -1    return 시 내림차순으값이 앞으로)

 

 

내가 처음에 작성한 코드

 
const arr = ['sun', 'bed', 'car'];  

arr.sort((a, b) => {
    console.log(a,b);
    // console.log(b);
    if (a[1] > b[1]) {
        return 1;
    } if (a[1] === b[1]) {
        return 0
    } if (a[1] < b[1]) {
        return -1
    }
});

console.log(arr.sort());

 

결과는 바로바로..! 

 [ 'bed', 'car', 'sun' ]

엥? 왜.. 왜지?

내 코드의 오류 

1. console.log(arr(sort()); => 기껏 돌린 arr를 다시 오름차순으로 sort한 결과이기 때문

  ㄴ console.log(arr); 로 하면 원하던 대로 [ 'car', 'bed', 'sun' ] 결과가 나옴

2. 또한 만약 [1] 번째 알파벳이 동일할 경우 사전식으로 하라고 했는데, 이 코드의 경우 반영을 할 수 없음

 

모범답안

 
const strings = ["sun", "bed", "car"]

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

    // 1. 문자열이 같은 경우 사전식으로 하라고 했으니까 각 요소에 해당번째 문자열을 밖을 빼서 앞에 붙인다음 그걸 사전식으로 돌리면 되겠다.
    // 1-1. 뭘 붙일래도 하나씩 요소를 돌려가면서 작업을 해야되니까 일단 for문을 써야겠다.
    for(var i=0; i<strings.length; i++) {
        strings[i] = strings[i][n] + strings[i];
        // ex. car -> strings의 두번째
    }
       // 여기까지 어떻게 나오나 볼까?
       // console.log(strings); // [ 'usun', 'ebed', 'acar' ]

    // 2. 그걸 사전식으로 돌리고
    strings.sort()

    // 3. 이제 앞에 임시로 붙여놓은 문자를 떼어서 새로 리스트를 만들어줘야 완성이겠지?
    // 3-1. 얘도 어쨌든 각 요소의 앞에 거를 떼려면 "하나하나" 작업을 해줘야되니깐 일단? for문 작성
    for(i=0; i<strings.length; i++) {
        strings[i] = strings[i].replace(strings[i][0],"");
        answer.push(strings[i]);
    }
    // replace(a,b) 함수: replace (a = 바꿀 거, b = 어떻게 바꿀지)
    // 자 여기까지만 하면 solution(  ["sun", "bed", "car"] )해도
       아무것도 안나와 왜? 함수 안에 출력하라는 코드가 없잖아.
    // ok. 그러면 console.log(answer)을 해도 // [ ] 이렇게만 나와 왜?
    // 왜긴 answer 에 아무것도 안 넣어줫으니까~ answer가 뭔데
    // 위에서 [ ] 라고 정해줬잖아. 그 안에 알맹이들을 넣어야 뭐가 나오는거지.
    // [ ]가 뭐야 리스트지? 리스트에 마지막 요소 뒤에 요소 하나씩 붙이는 함수가 뭐였지? push
 
    // (1)
    // answer.push(strings);
    // console.log(answer);  // 엇 근데 이렇게 하면 [ [ 'car', 'bed', 'sun' ] ] 이렇게 나오네 왜지??
    // answer [ ] 안에 strings라는 리스트를 또 넣어줬으니까!
 
    // 그럼 어케 해야겠어. answer은 이미 [ ] 로 정해져있으니까 안에 들어갈 애들만 바꿔줘야겠지?
    // (2)
    // answer.push(strings[ i ]); (를 for문 밖에 놓고)
       console.log(answer);  // 엥 이랬더니 이번엔 [ undefined ] 가 나와... 대체 뭐야...    
    // i가 뭐니? for문에 속해있는 애 아니야? ㅇㅇ.. 그럼 for문 안에서 놀아야지 왜 밖으로 나와 for문 안에 넣어줘

    return answer;
}

solution(["sun", "bed", "car"],1);  // [ 'car', 'bed', 'sun' ]