본문 바로가기

알고리즘

프로그래머스 > 2018 KAKAO BLIND RECRUITMENT > 파일명 정렬

728x90

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

 

프로그래머스

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

programmers.co.kr

[나의 코드]

function solution(files){
  let splittedArray=[]
  let answer=[]

  for(i=0;i<files.length;i++){
    const match = files[i].match(/(\D+)(\d+)(.*)/);
    const [total,head,number,tail]=match
    splittedArray.push([head,number,tail])
  }

  const compare =(a,b)=>{
   if(a[0].toUpperCase()>b[0].toUpperCase()){
     return 1
   }else if(a[0].toUpperCase()===b[0].toUpperCase()){
     return parseInt(a[1])-parseInt(b[1])
   }else{
      return -1
   }
 
  }

  splittedArray.sort(compare)
  for(i=0;i<splittedArray.length;i++){
    answer.push(splittedArray[i].join(""))
  }
  return answer

}

정렬 부분은 인강으로 공부를 해서 그다지 어렵지만, 파일명을 head,number, tail 로 정확하게 구분하는 것이 가장 어려운 부분이었다.

정규표현식(regular expression)은 정말 봐도 봐도 잘 기억에 남지 않는것 같다.

몇가지 어려웠던 포인트들을 꼽자면,

 

1. 공백이 있는 경우 공백까지도 포함해서 head,number,tail을 쪼개야 마지막에 splittedArray[i].join("")을 해도 원래의 파일명을 그대로 복원 할 수 있다.

 

2. array.split(/[0-9]+/) 의 경우 모든 숫자를 기준으로 분리를 하고 해당 숫자는 분리되지 않는다. 또한 맨 첫번째로 나오는 연속된 숫자들의 묶음을 기준으로 나눠야 하기 때문에 숫자가 뒤에도 나올 경우에 적합하지 않는다(<= 이부분 때문에 코너케이스 잡느라 1시간 넘게 씀...)

 

728x90