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

Yeonsu Summer·2023년 3월 16일
0

알고리즘

목록 보기
23/24
post-thumbnail
post-custom-banner

1. 문제

17686 문제 보러가기

2. 정답

function solution(files) {
  files.sort((a, b) => {
     let [firstHead, firstNum] = getData(a);
     let [secondHead, secondNum] = getData(b);
      
     if (firstHead < secondHead) return -1;
     else if (firstHead > secondHead) return 1;
     return firstNum - secondNum;	
  });
    
  return files;
}

function getData(file) {
  let headIndex;
  let numberIndex;
  for (let i = 0; i < file.length; i++) {
    if (!headIndex && !isNaN(parseInt(file[i]))) {
      headIndex = i;
    }
    if (headIndex && isNaN(parseInt(file[i + 1]))) {
      numberIndex = i;
      break;
    }
  }
  const head = file.slice(0, headIndex);
  const number = file.slice(headIndex, numberIndex + 1);

  return [head.toLowerCase(), Number(number)];
}

내가 생각한 과정

  1. files를 앞에서부터 정렬한다.
  2. 두 file의 HEAD와 NUMBER 데이터를 구한다.
    - file을 순회한다.
    - 현재 문자가 숫자이고 HEAD를 나누는 인덱스가 결정되지 않았다면 HEAD인덱스를 현재 문자 인덱스로 지정한다.
    - 현재 문자가 숫자가 아니고 HEAD인덱스가 존재한다면 NUMBER인덱스를 현재 문자 인덱스로 지정하고 순회를 멈춘다.
    - HEAD는 인덱스0 이상 HEAD인덱스 미만의 문자열이다.
    - NUMBER는 HEAD인덱스 이상 NUMBER인덱스 미만의 문자열이다.
    - HEAD의 대소문자 구분을 없애 반환한다.
    - NUMBER의 타입을 숫자로 바꾸고 반환한다.
  3. HEAD가 작은 file이 앞으로 오도록 정렬한다.
  4. HEAD가 같다면 NUMBER가 작은 file이 앞으로 오도록 정렬한다.
  5. 정렬이 끝난 files를 반환한다.

간과한 점

isNaN() 을 사용할 때 매개변수 안에 문자열 그대로 대입하였다. 만약 "1"이나 "A"와 같은 문자를 대입한다면, "false"과 "true"처럼 예상과 같은 결과가 나온다.

" "나 ""와 같이 빈 문자를 대입한다면 어떤 결과가 나올까? 이 문제에서는 숫자가 아닌 것으로 인식해 "true"가 나오길 기대한다.

그러나 isNaN() 은 빈 문자나 공백을 숫자로 인식해 "false"를 반환한다.

isNaN(NaN); // true
isNaN(undefined); // true
isNaN({}); // true

isNaN(true); // false
isNaN(null); // false
isNaN(37); // false

// Strings
isNaN("37"); // false: "37" is converted to the number 37 which is not NaN
isNaN("37.37"); // false: "37.37" is converted to the number 37.37 which is not NaN
isNaN("37,5"); // true
isNaN("123ABC"); // true: Number("123ABC") is NaN
isNaN(""); // false: the empty string is converted to 0 which is not NaN
isNaN(" "); // false: a string with spaces is converted to 0 which is not NaN

// Dates
isNaN(new Date()); // false; Date objects can be converted to a number (timestamp)
isNaN(new Date().toString()); // true; the string representation of a Date object cannot be parsed as a number

따라서 isNaN() 안에서 문자열을 판단하고 싶다면 문자열을 숫자로 바꾸는 과정을 추가해야 안전하게 사용할 수 있다.


참고 링크

profile
🍀 an evenful day, life, journey
post-custom-banner

0개의 댓글