❌파일명 정렬(왜 틀린지 이유를 모르겠음)

2024. 6. 4. 18:41알고리즘/카카오

2018 KAKAO BLIND RECRUITMENT

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


이 문제는 HEAD와 NUMBER를 함수로 나눠서 구하는 코드와 Solution 내부에서 구하는 코드 두 개로 작성했다.

그런데 전자의 경우에는 테스트에 통과하지 못하고, 후자의 경우는 테스트에 통과한다.

대체 왜 그런건지 이유를 모르겠다.

 

통과❌

function getTail(str, head, number){
   return str.replace(head, "").replace(number, "");
}

function getNumber(str, head){
    let ret = "";
    str = str.replace(head, "");
    for(const char of [...str]){
        if(ret.length === 5) return ret;
        else{
            if(char !== ' ' && !Number.isNaN(Number(char))) ret += char;
            else return ret;            
        }
    }
}

function getHead(str){
    let ret = ''
    for(const char of [...str]){
        const asc = char.charCodeAt();
        if(asc >= 65 && asc <= 90 || asc >= 97 && asc <= 122 || char === '.' ||
           char === '-' || char === ' ') ret += char;
        else return ret;
    }
}

function solution(files) {
    const fileInfos = new Map();
    files.forEach((file)=>{
        const head = getHead(file);
        const number = getNumber(file, head);
        const tail = getTail(file, head, number);
        
        fileInfos.set(file, {'HEAD': head.toUpperCase(), 'NUMBER' : Number(number), 'TAIL' : tail });
    });
    
    files.sort((a, b)=>{
        if(fileInfos.get(a)['HEAD'] < fileInfos.get(b)['HEAD']) return -1;
        if(fileInfos.get(a)['HEAD'] > fileInfos.get(b)['HEAD']) return 1;
        if(fileInfos.get(a)['HEAD'] === fileInfos.get(b)['HEAD']){
            if(fileInfos.get(a)['NUMBER'] < fileInfos.get(b)['NUMBER']) return -1;
            if(fileInfos.get(a)['NUMBER'] > fileInfos.get(b)['NUMBER']) return 1;
        }
    });
    
    return files;
}

 

통과⭕

function getTail(str, head, number){
   return str.replace(head, "").replace(number, "");
}

function getNumber(str, head){
    let ret = "";
    str = str.replace(head, "");
    for(const char of [...str]){
        if(ret.length === 5) return ret;
        else{
            if(char !== ' ' && !Number.isNaN(Number(char))) ret += char;
            else return ret;            
        }
    }
}

function getHead(str){
    let ret = ''
    for(const char of [...str]){
        const asc = char.charCodeAt();
        if(asc >= 65 && asc <= 90 || asc >= 97 && asc <= 122 || char === '.' ||
           char === '-' || char === ' ') ret += char;
        else return ret;
    }
}

function solution(files) {
    const fileInfos = new Map();
    files.forEach((file)=>{
        let head = "";
        let number = "";
        let flag = 0;
        for(const char of file){
            if(flag && Number.isNaN(Number(char))) break;
            if(char === ' ' || Number.isNaN(Number(char))) head += char;
            else {
                flag = 1;
                number += char;
            }
        }
        let tail = file.replace(head, "").replace(number, "");
        fileInfos.set(file, {'HEAD': head.toUpperCase(), 'NUMBER' : Number(number), 'TAIL' : tail });
    });
    
    files.sort((a, b)=>{
        if(fileInfos.get(a)['HEAD'] < fileInfos.get(b)['HEAD']) return -1;
        if(fileInfos.get(a)['HEAD'] > fileInfos.get(b)['HEAD']) return 1;
        if(fileInfos.get(a)['HEAD'] === fileInfos.get(b)['HEAD']){
            if(fileInfos.get(a)['NUMBER'] < fileInfos.get(b)['NUMBER']) return -1;
            if(fileInfos.get(a)['NUMBER'] > fileInfos.get(b)['NUMBER']) return 1;
        }
    });
    
    return files;
}

'알고리즘 > 카카오' 카테고리의 다른 글

n진수 게임  (0) 2024.06.04
튜플  (0) 2024.06.01
키패드 누르기  (0) 2024.06.01
수식 최대화  (0) 2024.06.01
메뉴 리뉴얼  (0) 2024.05.30