작성일 : 2022년 1월 1일

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

해설 : https://jaekwan.tistory.com/132?category=990965

나의 풀이

설명과 같이 HEAD, NUMBER, TAIL 까지 쪼갰는데 정렬을 실패함,,

//소스 파일 저장소에 저장된 파일명은 100 글자 이내로, 
//영문 대소문자, 숫자, 공백(" "), 마침표("."), 빼기 부호("-")만으로 이루어져 있다. 
//파일명은 영문자로 시작하며, 숫자를 하나 이상 포함하고 있다.

/*
NUMBER는 한 글자에서 최대 다섯 글자 사이의 연속된 숫자로 이루어져 있으며, 앞쪽에 0이 올 수 있다. 
0부터 99999 사이의 숫자로, 00000이나 0101 등도 가능하다.
TAIL은 그 나머지 부분으로, 여기에는 숫자가 다시 나타날 수도 있으며, 아무 글자도 없을 수 있다.
*/

function solution(files) {
    const lowerCaseFiles = files.map(word => {const numberIndex = [];
        
        for(let i=0; i<word.length; i++) {
            if(i-1 >= 0) {
              if(!Number.isNaN(+word[i-1]) && Number.isNaN(+word[i])) break;
            }
            if(!Number.isNaN(+word[i]) && word[i] !== " ") numberIndex.push(i);
        }
        
        return {
                head: word.slice(0, numberIndex[0]),
                number: word.slice(numberIndex[0], numberIndex[numberIndex.length-1]+1),
                tail: word.slice(numberIndex[numberIndex.length-1]+1),
               }
    });
    
    //console.log(lowerCaseFiles)
    
    //lowerCaseFiles.forEach(obj => console.log(obj.head[0]))
    
    lowerCaseFiles.sort((a,b) => {
        if(a.head.toLowerCase() > b.head.toLowerCase()) return 1;
        else if(a.head.toLowerCase() < b.head.toLowerCase()) return -1;
        else return a.number - b.number;
    });
    
    return lowerCaseFiles.map(obj => Object.values(obj).join(''));
}

/*
정확성: 20.0
효율성: 0.0
합계: 20.0 / 50
*/

풀이 해설

 function solution(files) {
    var answer = [];    
    let file = [];
    
    // 주어진 파일들을 입력받는 부분.
    for(let i=0; i<files.length; i++){                
        let head = /^[\\D]*/g.exec(files[i])[0];
        files[i] = files[i].replace(/^[\\D]*/g,'');
        
        let number = /[\\d]*/g.exec(files[i])[0]; 
        files[i] = files[i].replace(/[\\d]*/,'');
                
        let tail = files[i];        
        file.push( {'head':head, 'number':number, 'tail':tail});
    }   
   
    
    // head 부분 기준 사전 순 정렬.
    file.sort((a,b) => {
        let aHead = a.head.toLowerCase();
        let bHead = b.head.toLowerCase();
        if(aHead < bHead) return -1;
        else if(aHead > bHead) return 1;
        else {
            let aNumber = parseInt(a.number);
            let bNumber = parseInt(b.number);            
            
            if(aNumber < bNumber) return -1;
            else if(aNumber > bNumber) return 1;
            else return 0;
        }
    })
    
    for(let i=0; i<file.length; i++){
        let fileName = file[i].head + file[i].number + file[i].tail;
        answer.push(fileName);
    }
    
    return answer;
}

후기

정규표현식을 공부해봐야 할것 같다,,