React

03 로그파일 재정렬

로그를 재정렬하라 1. 로그 가장 앞부분이 식별자다. 2. 문자로 구성된 로그가 숫자 로그보다 앞에 온다. 3. 식별자는 순서에 영향을 끼치지 않지만, 문자가 동일한 경우 식별자 순으로 한다. 4. 숫자 로그는 입력 순서대로 한다.

My solution

문제 이해가 잘 안되는 부분이 있었는데 리트코드에 있는 문제라서 가서 보고 예시를 비교해보고 재정렬 기준에 대해 이해했다.
2. 문자로 구성된 로그가 숫자 로그보다 앞에 온다.
즉, 문자들로 구성된 let1 art can이나 let3 art zero 같은 로그가 dig1 8 1 5 1처럼 숫자가 섞인 로그보다 앞에 온다는 의미이다.
따라서 문자들로 구성된 로그를 찾아낼 수 있어야 했다. 이걸 letterLogs로 이름지었고 sorting후에는 앞에 집어 넣어줬다.( [...sortedLetterLogs, ...digitLogs]
const sortedLetterLogs = letterLogs.sort((a, b) => { // & : 첫 부분로그를 제거한 로그를 비교한다. // & : 지정한 인덱스부터 끝까지 자른다. const strA = a.slice(a.indexOf(' ') + 1); const strB = b.slice(b.indexOf(' ') + 1); if (strA > strB) return 1; // & : 첫 부분로그를 제거한 로그가 같으면 전체 문자열을 비교한다. if (strA === strB) { // & : '<', '>' 연산자는 문자열을 '사전 순서' 대로 비교하여 결과를 리턴 // & : a가 더 크면 0보다 큰 수(1)를 반환해서 b가 앞에 오도록 정렬한다. if (a > b) return 1; if (a === b) return 0; return -1; } // & : strA가 더 작으면 0보다 작은 수(-1)를 리턴시켜 순서는 변경되지 않는다. return -1; });
JavaScript
복사
strA : own kit dig
strB : art can
이 경우 strA > strB로 검사해서 true가 되면 양수를 리턴시켜서 b를 앞으로 순서를 뒤바꿔준다.
이렇게 첫 부분로그를 제거한 로그로만 검사해도 같다면 그때는 a와 b로만 검사한다.
a와 b는 문자열인데 >로 대소비교가 가능하다. 문자열의 경우는 사전 순서대로 비교해준다. a가 b보다 더 크면 0보다 큰 수를 반환해서 b가 앞으로 오도록 정렬할 수 있다.
나는 숫자를 판별하기 위해서 Number.isInteger(92%^)를 사용했는데, Number.isNaN이 false가 되는 것을 숫자라고 판별하는 것이 더 빨랐다.(97%^) +log[log.length-1]한 부분은 문자를 강제숫자화시켜 숫자가 안되면 NaN이 되버리므로 Number.isNaN으로만 검사하면 확인할 수 있다.

Code

const reorderLogFiles = function (logs) { // 숫자로 정렬해야할지 확인한다.(letterLogs) const [letterLogs, digitLogs] = logs.reduce( ([letterLogs, digitLogs], log) => !Number.isNaN(+log[log.length - 1]) ? [letterLogs, [...digitLogs, log]] : [[...letterLogs, log], digitLogs], [[], []] ); const sortedLetterLogs = letterLogs.sort((a, b) => { // & : 첫 부분로그를 제거한 로그를 비교한다. // & : 지정한 인덱스부터 끝까지 자른다. const strA = a.slice(a.indexOf(' ') + 1); const strB = b.slice(b.indexOf(' ') + 1); if (strA > strB) return 1; // & : 첫 부분로그를 제거한 로그가 같으면 전체 문자열을 비교한다. if (strA === strB) { // & : '<', '>' 연산자는 문자열을 '사전 순서' 대로 비교하여 결과를 리턴 // & : a가 더 크면 0보다 큰 수(1)를 반환해서 b가 앞에 오도록 정렬한다. if (a > b) return 1; if (a === b) return 0; return -1; } // & : strA가 더 작으면 0보다 작은 수(-1)를 리턴시켜 순서는 변경되지 않는다. return -1; }); return [...sortedLetterLogs, ...digitLogs]; };
JavaScript
복사

Code

Solution

1. 람다와 + 연산자 이용

위 문제는 매우 실용적인 로직이다.
문자로 구성된 로그가 숫자 로그보다 이전에 오며, 숫자 로그는 입력 순서대로 둔다.
따라서 문자와 숫자를 구분해서 숫자는 나중에 그대로 이어 붙인다.
숫자 로그도 문자열화되어 있으므로 isdigit()을 이용해 숫자 여부를 판별한다.
→ js에서는 Number.isInteger()를 사용하거나 !Number.isNaN()으로 판별할 수 있다.
이후 문자 로그가 모두 모이면 식별자를 제외한 문자열만을 가지고 정렬한다.
이렇게 정렬되지 않은 경우에는 식별자로 정렬한다.