[JavaScript][Programmers] 파일명정렬

조준형·2021년 9월 5일
0

Algorithm

목록 보기
126/142
post-thumbnail

🔎 뉴스 클러스터링

❓ 문제링크

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

📄 제출 코드

function solution(files) {
  let answer = [];
  let copyFiles = [];
  const regex = /(\d+)/g; // 숫자가 1개이상 매칭되는 정규식

  // [순서, 헤드, 숫자, 꼬리]
  for (let i = 0; i < files.length; i++) {
    copyFiles.push([i, ...files[i].split(regex)]);
  }
  console.log(copyFiles);
  sortFiles(copyFiles);
  console.log(copyFiles);
  answer = copyFiles.map(el => {
    return el.slice(1).join('');
  })
  return answer
}

function sortFiles(copyFiles) {
  copyFiles.sort((a, b) => {
    // 헤드 대소문자통일
    let headA = a[1].toUpperCase();
    let headB = b[1].toUpperCase();

    if (headA == headB) {
      let numA = parseInt(a[2]);
      let numB = parseInt(b[2]);
      if (numA > numB) return 1;
      else if (numA < numB) return -1;
      else return a[0] - b[0];
    } else if (headA > headB) return 1;
    else return -1;
  })
}
let files = ["img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG"];
console.log(solution(files));

처음엔 sort의 함수부분만 잘 작성하면 쉽게 풀 수 있다는 생각이 들었다. 그러나 정작 힘들었던건 head number tail을 나누는 부분이였다.정규표현식이 아니라 반복문으로 일일이 나눠서 하려했는데 돌면서 숫자가 나오면 여태 저장한 문자열을 head에 넣고, 숫자끝나면 숫자넣고, 나머지 넣고, 이런식으로 구현하다보니까 너무 복잡해졌다. 또 이렇게 작성하다가 예제케이스 중에 foo010bar020.zip 가 있다.
이 부분은 head : foo, num : 010, tail : bar020.zip가 되야하는데 내가 한대로하면은 head: foo, num : 010, 020, tail:bar,.zip이 되버렸다. 그래서 flag를 세워서 반복문을 고치려니까 너무 복잡해졌다.

결국 다른사람의 코드에서 정규표현식을 이용한방법을 참고하게 되었다.

const regex = /(\d+)/g;

위 정규식은 숫자가 1개 이상 매칭되는 정규식이라고한다.
또 하나 알게된 사실은 split()에 정규표현식을 넣게 되면 정규표현식에 맞는 문자 기준으로 나뉜다는 것이다. 이걸 보고 mdn에서 찾아보았는데 아래쪽에 정규표현식으로 된 예제를 보게되었다.

이제 copyFiles에 나누게 되었고, sort만 하면 된다.
copyFiles는 아래처럼 구성되있다.

[순서(idx), 머리(head), 숫자(number), 꼬리(tail)]

먼저 머리 기준으로 정렬해야하는데 머리가 똑같을 경우 숫자기준으로 정렬한다.
(숫자는 문자로 저장되있으므로 parseInt로 숫자형으로 변경.)

if (headA == headB) {
      let numA = parseInt(a[2]);
      let numB = parseInt(b[2]);
      if (numA > numB) return 1;
      else if (numA < numB) return -1;
      else return a[0] - b[0];
    } else if (headA > headB) return 1;
    else return -1;

숫자형이 같은 경우엔 순서 기준으로 정렬한다.

sortFiles가 끝난 후 정렬된 배열이 있다.
정답은 앞의 순서를 때고 문자열형태로 배열이 저장되있다.
map을 이용해 새로운 배열을 만들어 return할건데 이 때 slice를 이용해 가장 앞부분을 제외하고 join()을 해서 정답을 출력한다.
아직까지 연습이 많이 필요해보인다,,

📘 참고

https://angwangho.github.io/algorithm-filename-sort/
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split

profile
깃허브 : github.com/JuneHyung

0개의 댓글