❌파일명 정렬(왜 틀린지 이유를 모르겠음)
2024. 6. 4. 18:41ㆍ알고리즘/카카오
https://school.programmers.co.kr/learn/courses/30/lessons/17686
이 문제는 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;
}