본문 바로가기
알고리즘

[카카오2018] [3차] 파일명 정렬

by limew 2023. 12. 9.

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

 

 

 


문제 요점

  • 파일명 정렬은 문자가 아닌 숫자를 반영한다
  • 파일명은 100 글자 이내로, 영문 대소문자, 숫자, 공백(" "), 마침표("."), 빼기 부호("-")를 포함한다.
  • 파일명은 영문자로 시작하며, 숫자를 하나 이상 포함한다.
  • head-number-tail 구조로 이루어져있다
    • head는 숫자아닌 문자만 오고 최소 한 글자
    • number는 숫자 한 글자에서 다섯글자 연속된 숫자 앞쪽에 0이 올 수 있다
    • tail은 숫자, 문자 다 올 수 있다. 아무 글자가 없어도 된다.
  • 정렬기준
    1. head 사전순 (대소문자 구분없음)
    2. head가 같으면 number순으로 정렬 (앞에 0을 제외한 숫자만으로 오름차순)
    3. head, number 모두 같으면 그냥 그대로 유지

풀이

1. 각각 파일명을 head, number, tail로 구분 (head는 문자만, number는 숫자만 그 외는 tail)
2. 정렬 기준에 맞춰 정렬

 

주의할 부분

  • number는 다섯자리 이상일 때 넘어간 수는 tail로 여겨진다
  • head sort할때  "," , "-" , " " 모두 포함해서 sort해야한다.
  • \D는 숫자 이외 모든 문자다 ( "," , "-" ,  공백 모두 포함 )
  • match ()로 구분할 수 있다.

 

문자열.match(regex)

regex의 match() 메서드는 문자열 내에서 정규식과 일치하는 부분을 찾아 배열로 반환한다.

예를 들어 숫자만 찾고 싶다면 아래와 같이 찾을 수 있다.

 

const text = 'I have 10 apples and 20 oranges.';
const regex = /\d+/g; // 숫자에 해당하는 정규식

const matches = text.match(regex);
console.log(matches); // ["10", "20"]

 

 

g 플래그를 사용하면 문자열에서 모든 숫자를 찾아 배열로 반환한다.

g 플래그가 없다면 첫번째로 match되는 것만 아래와 같이 반환한다. (index, input, groups포함)

index:  match가 시작되는 인덱스를 나타낸다.

input: 전체 문자열

[
  '10',
  index: 7,
  input: 'I have 10 apples and 20 oranges.',
  groups: undefined
]

 

regex ( )

정규식에서 ()는 그룹화를 나타내며, 이는 패턴을 하나의 단위로 취급하거나 매칭된 결과를 추출할 때 유용하다.

예를 들어 매칭된 결과에서 특정 부분을 추출하고자 할 때 사용할 수 있다.

 

const regex = /(\D+)(\d+)/;
const text = "abc123";

const matches = text.match(regex);
console.log(matches);
// [
//   'abc123',
//   'abc', // 첫번째 매칭
//   '123', // 두번째 매칭
//   index: 0,
//   input: 'abc123', // 전체
//   groups: undefined
// ]

 

 

위에서 match를 통해 head와 number를 추출한 뒤 정렬한다

sort

  1. 사전순이 같으면 숫자순으로 정렬한다
  2. 사전순으로 정렬한다.

 

arr.sort((a, b) => {
  if (a > b) return 1;
  else if (a < b) return -1;
  else return a.number - b.number;
});

 


전체코드

function solution(files) {
  files = files
    .map((file) => file.match(/(\D+)(\d+)/))
    .sort((a, b) => {
      const aLowerCase = a[1].toLowerCase();
      const bLowerCase = b[1].toLowerCase();
      // 사전순이 같으면 숫자순 정렬
      if (aLowerCase === bLowerCase) {
        return Number(a[2]) - Number(b[2]);
      }
      // 사전순 정렬
      if (aLowerCase < bLowerCase) return -1;
      else return 1;
    });
  return files.map((file) => file.input);
}

 

 

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

방금그곡  (0) 2023.12.12
[카카오2020] 괄호 변환  (0) 2023.12.10
H-Index  (0) 2023.12.08
[프로그래머스 lv2] 숫자 카드 나누기  (0) 2023.12.08
줄 서는 방법  (0) 2023.12.08