프로그래머스 #javascript - [3차]파일명 정렬

SSO·2020년 5월 11일
0

프로그래머스 Lv2

목록 보기
45/46
post-custom-banner

문제

https://programmers.co.kr/learn/courses/30/lessons/17686

풀이

  1. 실패 - 1,2만 통과 -> 왜? sort의 Index 고려하기!
function solution(files) {
    var answer = [];
    
    // 파일명 구분 H, N, T
    // H - 사전순. 대소문자 구별X
    // N - 맨앞 0 무시
    // T 고려하지 않고 원래 순서대로 정렬 - 어차피 T무시니까 소문자 통일 가능
    
    // for(var i=0; i<files.length; i++){
    //    files[i] = files[i].toLowerCase(); 
    // } //비교할 때만 바꿔야 해.
    
    var regexNum = /[0-9]/g;
    files.sort((a,b)=>{
        // regex에 매치되는 첫 Index 찾기
        var numIndexA = a.indexOf((a.match(regexNum))[0]);
        var numIndexB = b.indexOf((b.match(regexNum))[0]);

        // Head 기준 정렬
        var sortByHead = (a.substring(0, numIndexA)).toLowerCase().localeCompare(b.substring(0, numIndexB).toLowerCase());
        
        //1, -1, 0
        if(sortByHead === 0) {// Num기준 정렬
            var subStrA = parseInt(a.substring(numIndexA));
            var subStrB = parseInt(b.substring(numIndexB));

            if(subStrA<subStrB){
                return -1;
            }else if(subStrA>subStrB){
                return 1;
             }else {
                return 0;
            }
         } else if(sortByHead === -1){ //이하 Head기준 정렬만
             return -1;
         } else {
             return 1;
         }
     });

    return files;
}

2.성공
function solution(files) {
    var answer = [];
    let answerWrap = files.map((file, index) => ({file, index}));
    
    // 파일명 구분 H, N, T
    // H - 사전순. 대소문자 구별X
    // N - 맨앞 0 무시
    // T 고려하지 않고 원래 순서대로 정렬 - 어차피 T무시니까 소문자 통일 가능
    
    // for(var i=0; i<files.length; i++){
    //    files[i] = files[i].toLowerCase(); 
    // } //비교할 때만 바꿔야 해.
    
 
    var compare = (a,b)=>{
         var regexNum = /[0-9]/g;
        
        // regex에 매치되는 첫 Index 찾기
        var numIndexA = a.indexOf((a.match(regexNum))[0]);
        var numIndexB = b.indexOf((b.match(regexNum))[0]);

        // Head 기준 정렬
        var sortByHead = (a.substring(0, numIndexA)).toLowerCase().localeCompare(b.substring(0, numIndexB).toLowerCase());
//       console.log((a.substring(0, numIndexA)).toLowerCase());

        //1, -1, 0
        if(sortByHead === 0) {// Num기준 정렬
            var subStrA = parseInt(a.substring(numIndexA));
            var subStrB = parseInt(b.substring(numIndexB));
            if(subStrA<subStrB){
                return -1;
            }else if(subStrA>subStrB){
                return 1;
             }else {
               return 0;
            }
         } else if(sortByHead === -1){
             return -1;
         } else {
             return 1;
         }
     }

   answerWrap.sort((a, b) => {
      var result = compare(a.file, b.file);
      return result === 0 ? a.index - b.index : result;
    })
    return answerWrap.map(answer => answer.file);
}

더 생각해보기

  1. 처음: Head, Num 기준 정렬을 병렬적으로 -> return 이하는 실행되지 않음을 간과
  2. sort함수가 불안정해서 a, b가 같은 경우 index를 고려해야 함!!!(원래 순서대로 맞추기 위해)

참고사항

profile
happy
post-custom-banner

0개의 댓글