reorderLogFiles

Hyor·2022년 6월 8일
0
post-custom-banner

logs 배열이 input 으로 주어지며 각 로그는 공백으로 구분된 문자열이고 첫 번째 단어는 식별자이다.

로그는 두 가지 유형이 있다.
Letter-logs : 모든 단어(식별자 제외)는 영문 소문자로 구성
Digit-logs : 모든 단어(식별자 제외)는 숫자로 구성

letter-logs 는 모든 digit-logs 앞에 오고 letter-logs는 내용에 따라 사전순으로 정렬되며 내용이 같으면 식별자를 기준으로 사전순으로 정렬, 숫자 로그 는 상대적인 순서를 유지하며 로그의 최종 순서 반환.

input
logs = ["dig1 8 1 5 1","let1 art can","dig2 3 6","let2 own kit dig","let3 art zero"]
output
["let1 art can","let3 art zero","let2 own kit dig","dig1 8 1 5 1","dig2 3 6"]

input
logs = ["a1 9 2 3 1","g1 act car","zo4 4 7","ab1 off key dog","a8 act zoo"]
output
["g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]

var reorderLogFiles = function (logs) {
  const digits = [];
  const letter = [];
  logs.forEach((log) => {
    const splitLog = log.split(" ");
    const value = splitLog.slice(1, splitLog.length).join("");
    if (!!Number(value)) {
      digits.push(log);
    } else {
      letter.push(log);
    }
  });

  letter.sort((a, b) => {
    const aLog = a.split(" ");
    const aValue = aLog.slice(1, aLog.length).join(" ").toUpperCase();
    const bLog = b.split(" ");
    const bValue = bLog.slice(1, bLog.length).join(" ").toUpperCase();
    if (aValue === bValue) {
      const aKey = aLog[0].toUpperCase();
      const bKey = bLog[0].toUpperCase();
      return aKey > bKey ? 1 : -1;
    }
    return aValue > bValue ? 1 : -1;
  });

  return letter.concat(digits);
};

첫번째 forEach 를 통해서 식별자를 제외한 문자열중 number로 parsing 이 되는 경우 digits, 안되는 경우 letter 로 구분
letter forEach 는 식별자를 제외한 내용을 사전순으로 정렬하고, 식별자를 제외한 내용이 같다면 식별자를 사전순으로 정렬
마지막으로 letter에 digits 를 concat를 해서 반환

profile
개발 노트
post-custom-banner

0개의 댓글