파일명 정렬

은유로그·2022년 3월 12일
0

👩‍💻 algorithm

목록 보기
10/11

간단 문제 설명

자세한 문제 설명은 👉 프로그래머스 - 카카오 3차 블라인드 코딩테스트

  • 입력받은 파일명은 아래와 같이 세 부분으로 구분한다.
파일명 = {
	HEAD: 숫자가 아닌 문자로 이루어져 있고 최소 한 글자 이상(대소문자,
특수문자),
	NUMBER: 1개 ~ 5개 사이의 연속된 숫자로 이루어져 있고 앞쪽에 0이 올 수 있음,
	TAIL: 나머지 부분으로 숫자가 다시 나타날 수 있고 빈 문자열이 될 수 있음
}
  • HEAD 부분을 기준으로 사전 순으로 정렬 (1순위), 이때 대소문자 구분을 하지 않는다.
  • HEAD 부분의 순서가 같을 경우 NUMBER 부분의 오름차순으로 정렬 (2순위), 이때 맨 앞의 숫자 0은 무시
  • HEAD 부분, NUMBER 부분 모두 같을 경우 원래 입력에 주어진 순서 유지 (3순위)
  • 위 조건들에 맞춰 정렬하여 출력

수도코드

  • 내장함수 sort()를 재정의하여 푼다.
  • Head = 숫자가 아닌 문자로 시작해 숫자 직전까지의 문자열이므로 숫자가 아닌 문자열까지 찾으면 된다.
  • Number = 숫자로 시작해 숫자가 아닌 문자 직전까지의 문자열 이므로 숫자로 이루어진 문자열을 찾으면 된다.
  • 단, 0으로 시작하면 빈 문자열로 대체한다.
  • sort()를 재정의하므로 두 요소의 각 Head와 Number를 비교하여 정렬한다.

코드

function solution(files) {
    return files.sort((a, b) => { // sort() 함수 사용
        
        const headA = a.match(/^\D+/)[0].toLowerCase();
      // ^: 시작을 의미, \D: 숫자를 제외한 모든 문자, +: 하나 혹은 여러개를 의미
      // /^\D+/: 숫자를 제외한 모든 문자로 시작하며 그 문자열이 하나 혹은 여러개를 골라내는 정규표현식
      // match() 함수를 통해 위 정규표현식과 매치하는 부분을 골라낸 후
      // 비교하기 편하게 소문자로 치환
      // (match()의 리턴값은 배열이고 0번째에 정규표현식으로 걸러낸 문자열이 담겨있다)
        const headB = b.match(/^\D+/)[0].toLowerCase();
      // 위와 동일함
        
        if(headA < headB) return -1;
      // headA보다 headB가 크면 headA가 더 앞에 온다는 뜻이므로
      // 음수 리턴 (순서 바꾸지 않는다는 뜻)
        else if(headA > headB) return 1;
      // 위와 반대
        
        const numberA = a.match(/\d+/)[0].replace(/^0+/, "");
      // \d: 숫자만 포함
      // /\d+/: 숫자로 시작하며 그 문자열이 하나 혹은 여러개를 골라내는 정규표현식
      // /^0+/: 0으로 시작하며 그 문자열이 하나 혹은 여러개를 골라내는 정규표현식
      // match() 함수를 통해 위 정규표현식과 매치하는 부분을 골라낸 후
      // 0으로 시작하면 빈 문자열로 치환
        const numberB = b.match(/\d+/)[0].replace(/^0+/, "");
      // 위와 동일함
        
        return numberA - numberB;
    })
}
profile
๑•‿•๑

0개의 댓글