[리트코드, 프로그래머스] 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부분이 정말 깔끔하다.
삼항연산자로 한번에 처리하는 것도 좋은 것 같다.