[리트코드, 프로그래머스] Longest Palindromic Substring, 파일명 정렬
Longest Palindromic Substring
나의 풀이
const getPalindrome = s => (s === [...s].reverse().join('') ? true : false);
const longestPalindrome = s => {
const isPalindrome = [];
for (let i = 0; i < s.length; i++) {
for (let j = i + 1; j <= s.length; j++) {
if (getPalindrome(s.substring(i, j))) isPalindrome.push(s.substring(i, j));
}
}
return isPalindrome.reduce((acc, cur) => {
if (acc.length < cur.length) acc = cur;
return acc;
}, '');
};
이중 for문을 사용하여 가능한 모든 경우의 수를 조회하여 getPalindrome 함수를 통해 팰린드롬인지 여부 파악
맞으면 isPalindrome 배열에 추가
가장 길이가 긴 요소를 return (클 때만 acc가 바뀌므로 길이가 같으면 먼저 들어온 문자열이 반환)
이중 for문 말고 함수형으로 만들어보고싶었는데, 그게 더 더럽고 복잡해서 안했다.
파일명 정렬
나의 풀이
function solution(files) {
return files.sort((x, y) => {
const xHeader = x
.match(/^[A-Za-z\.-\s]+/gi)
.join("")
.toLowerCase();
const yHeader = y
.match(/^[A-Za-z\.-\s]+/gi)
.join("")
.toLowerCase();
if (xHeader < yHeader) return -1;
else if (xHeader > yHeader) return 1;
const xNumber = x.match(/[0-9]{1,5}/).join("") / 1;
const yNumber = y.match(/[0-9]{1,5}/).join("") / 1;
if (xNumber < yNumber) return -1;
else if (xNumber > yNumber) return 1;
});
}
- sort와 정규식을 통해 정렬
- 내가…스스로 이런걸 해냈다는게 너무 너무 뿌듯하다ㅠㅠㅠ
다른분 코드
const solution = files => {
files.sort((file1, file2) => {
const regExp = /^([a-zA-Z\s.-]+)([0-9]{1,5})([\w\s.-]*)$/;
const [, HEAD1, NUMBER1] = file1.match(regExp);
const [, HEAD2, NUMBER2] = file2.match(regExp);
const [head1, head2] = [HEAD1.toUpperCase(), HEAD2.toUpperCase()];
const [number1, number2] = [+NUMBER1, +NUMBER2];
if (head1 !== head2) return head1.localeCompare(head2);
if (number1 !== number2) return number1 - number2;
});
return files;
};
스터디 같이하시는 승연님코드인데, 그룹으로 지정해놓고 디스트럭처링으로 가져온게 너무 멋있다.
진짜 보자마자 감탄밖에 안나왔다.
내 코드도 깔끔하게 짰다고 생각했는데, 이 코드가 훨씬 더 마음에 든다.
localeCompare 메소드도 새로 알게 되었다!
const solution = (files) => {
const separateFileName = (fileName) => {
const head = fileName.match(/^([A-Za-z .-]+)(?=\d)/)[0];
const number = fileName.match(/\d{1,5}/);
const tail = fileName.slice(number.index + number[0].length);
return { head, number: number[0], tail };
};
return files
.map((fileName) => separateFileName(fileName))
.sort((fileA, fileB) => {
const headA = fileA.head.toLowerCase();
const headB = fileB.head.toLowerCase();
return headA > headB ? 1 : headA < headB ? -1 : fileA.number - fileB.number;
})
.map(({ head, number, tail }) => `${head}${number}${tail}`);
};
창민님 코드인데 sort부분이 정말 깔끔하다.
삼항연산자로 한번에 처리하는 것도 좋은 것 같다.