문자열 내 마음대로 정렬하기

Happhee·2022년 1월 31일

[ LV1 ]  programmers

목록 보기
2/4
post-thumbnail

배열 관련 method

📍 Array.prototype.sort()

sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환
정렬 순서는 문자열의 유니코드 코드 포인트를 따라 정렬된다

기본 구문 arr.sort([compareFunction])

let numbers = [1, 2, 3, 4, 5]
console.log(numbers.sort((a ,b) =>{
  return b-a;
});	
// [5, 4, 3, 2, 1]

📍 Array.prototype.map()

map() 메서드는 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환

기본 구문 arr.map(callback(currentValue[, index[, array]])[, thisArg])

  • callback
    새로운 배열 요소를 생성하는 함수
    1. currentValue 처리할 현재 요소
    2. index Optional 처리할 현재 요소의 인덱스
    3. array Optional map( )을 호출한 배열
  • thisArg Optional
    callback 실행할때 this로 사용되는 값

📝 문자열 내 마음대로 정렬하기

🖥 나의 JS 코드

첫번째 시도

function solution(strings, n) {
  //n번째의 알파벳들을 담을 배열 생성
   let alpha = [];
    for(const str of strings){
        alpha.push(str[n]);
    }
    
  // 중복되는 문자를 제거
    alpha = [...new Set(alpha)]
  
 // 문자마다 해당되는 요소들을 담기위한 2차원 배열을 생성
  let sortArray = new Array(alpha.length);
    for(let i = 0 ; i < alpha.length ; i++){
        sortArray[i] = new Array();
    }
    
  // n번째의 문자을 가진 요소들을 index에 맞춰 
  // 2차원 배열에 담아주기
    for(const str of strings){
        const index = alpha.indexOf(str[n]);
        sortArray[index].push(str);
    }
  
  // 사전순으로 이를 정렬  
    sortArray = sortArray.map((arr)=>{
        return arr.sort();
    })
  
  // 결과를 반환할 배열 생성
    let result = []
    
    // 스프레드 문법을 사용하여 
    // sortArray에 담긴 요소들을 1차원 배열로 형성
    sortArray.map((arr)=>{
        result.push(...arr);
    });
  // 최종 결과값 반환
    return result
}

두번째 시도

첫번째 시도는 코테 문제를 풀기 시작한지 얼마 되지않았을 때의 코드이었기 때문에, 연습을 많이 하고나서 이후에 다시 한번 풀어보았다.

map( ), fill( ), flat( )과 같은 메서드를 사용하여 첫번째보다 많이 단축된 코드로 다시 문제를 해결하였다

변화된 부분

  • map을 사용하여 알파벳을 담아주기
  • 이차원 배열 초기화 방법을 단순 반복문에서 fill. map을 사용하여 간결하게 표현
  • 평탄화 함수를 작성하여 결과 반환

최종 코드는 다음과 같다👇

function solution(strings, n) {
    // 비교해야할 알파벳 담아주기
    let alphabet = strings.map((str) => str[n]);
    // 중복 요소 제거 후 정렬
    alphabet = [...new Set(alphabet)]
    alphabet.sort();
    // 정렬된 알파벳 기준으로 단어들을 넣어줄 배열 초기화
    let arr = new Array(alphabet.length)
        .fill(0)
        .map(() => new Array());
    // 2차원 배열에 정렬 순으로 담아주기
    strings.forEach((str, index) => {
        arr[alphabet.indexOf(str[n])].push(str);
    })
    // 이차원 내의 각각의 배열들을 사전 순으로 정렬
    arr = arr.map((data) => data.sort())
    // 평탄화시켜서 최종 결과 반환
    return arr.flat()
}
profile
즐기면서 정확하게 나아가는 웹프론트엔드 개발자 https://happhee-dev.tistory.com/ 로 이전하였습니다

0개의 댓글