[프로그래머스 level2] [3차] 파일명 정렬

정대만·2023년 6월 26일

코딩테스트

목록 보기
1/51
post-thumbnail

설명

  • 파일명은 우선 HEAD 부분을 기준으로 사전 순으로 정렬한다. 이때, 문자열 비교 시 대소문자 구분을 하지 않는다. MUZI와 muzi, MuZi는 정렬 시에 같은 순서로 취급된다.

  • 파일명의 HEAD 부분이 대소문자 차이 외에는 같을 경우, NUMBER의 숫자 순으로 정렬한다. 9 < 10 < 0011 < 012 < 13 < 014 순으로 정렬된다. 숫자 앞의 0은 무시되며, 012와 12는 정렬 시에 같은 같은 값으로 처리된다.

  • 두 파일의 HEAD 부분과, NUMBER의 숫자도 같을 경우, 원래 입력에 주어진 순서를 유지한다. MUZI01.zip과 muzi1.png가 입력으로 들어오면, 정렬 후에도 입력 시 주어진 두 파일의 순서가 바뀌어서는 안 된다.

나만의 해석

head / number / tail 을 나눠야되기 때문에
우선 number 의 시작과 끝을 구하면 head 와 tail 이 자동으로 구해질거라고 생각했다.

따라서 for 문을 돌리면서

  if(Number.isInteger(parseInt(hey[i]))==true &&index_hey.length<=5 ){
            if(first==0){
                  first=i;
              }
              // 처음숫자가 나오면 first 가 변한다. 
              
             index_hey+=hey[i] 
             final_index= Math.max(final_index,i);
             
             //tail 를 찾기 위해 마지막으로 끝나는 number를 찾는다. 
             
            }
            
           
        }
            answer.push([hey.slice(0,first).join('') 
            ,index_hey, hey.slice(final_index+1,hey.length).join('')])
            //그다음 slice 형태로 자르면된다. 
            
            

여기서 에러가 난 부분 / 해맸던 부분

  • parseInt 를 잘 몰랐던것

parseInt() 함수는 문자열 인자를 파싱하여 특정 진수(수의 진법 체계에서 기준이 되는 값)의 정수를 반환합니다.

parseint 는 그냥 10진수 형태로 형변환만 해주는 거라고 만 알고 있어
parseint(001) 이 들어가면 > 001 이 나올거라고 생각했었다. 1 이런형식으로 정수 형태로 바뀌는것을 알수 있었다.

  • isNaN 함수

    isNaN() isNaN() 함수는 어떤 값이 NaN 인지 판별합니다.

이것을 통해 head 부분이 시작할때 공백이 존재하면 안된다는것을 ... 확인할수 있다.

  • sort 함수
    sort 함수 안에 어떤 식으로 정렬할것인지 내가 짜서 넣을수 있다는 것을 알게 되었다..

결론


function solution(files) {
    var answer = [];
files.map((el,index)=>{
    var hey= el.split('');
    var index_hey='';
  let number='',head='',tail='';

    for(var i=0; i<hey.length; i++)
    {
           if(isNaN(parseInt(hey[i]))&&number.length==0)head+=hey[i]
    else if(!isNaN(parseInt(hey[i]))&&tail.length==0&& number.length<=5)number+=hey[i]
    else tail+=hey[i] 
      
        }

    
answer.push([head,number,tail])
})
   
answer.sort((a,b)=>{
    var Upcase_a= a[0].toLowerCase() ;
    var Upcase_b= b[0].toLowerCase() ;
    if(Upcase_a>Upcase_b){
        return 1;
    }
    else if( Upcase_a<Upcase_b){
        return -1;
    }
    else{
        const parseIntA = parseInt(a[1]), parseIntB = parseInt(b[1]);
            return parseIntA - parseIntB;
    }
})
   
    
    
    return answer.map((el)=>el.join(''));
 }

정규식을 이용하면 더 빨리 풀수 있다는것을 ..

profile
안녕하세요

0개의 댓글