시리즈: 알고리즘 (32개 글)
- 자바로 알고리즘 풀기
- [Java] 백준 10431 - 줄 세우기
- [Java & Node.js] 백준 9935 - 문자열 폭발
- [Node.js] 백준 22866 - 탑 보기
- [Java] 백준 4485 - 녹색 옷 입은 애가 젤다지?
- [Node.js] 백준 1283 - 단축키 지정
- [Java & Node.js] 백준 14469 - 소가 길을 건너간 이유 3
- [Java] 백준 8979 - 올림픽
- [Node.js] 백준 22866 - 탑 보기
- [Java] 백준 7568 - 덩치
- [Java] 백준 1244 - 스위치 켜고 끄기
- [Node.js] 백준 19941 - 햄버거 분배
- [Node.js] 백준 1254 - 팰린드롬 만들기
- [Java] 백준 2589 - 보물섬
- [Java] 백준 2309 - 일곱 난쟁이
- [Java] 백준 1789 - 수들의 합
- [Java] 백준 1987 - 알파벳
- [Node.js] [Rust] 백준 24460 - 특별상이라도 받고 싶어
- [Node.js] 백준 7576 - 탑 보기
- [Rust] 백준 1047 - 울타리 (N^4 브루트포스 + 그리디)
- [Node.js] 백준 9657 - 돌게임3
- [Rust] 백준 4963 - 섬의 개수
- [Node.js] 프로그래머스 - 모의고사 / 실패율
- [Rust] 백준 2667 - 단지번호붙이기
- [Node.js] 프로그래머스 - 방문 길이
- [Node.js] 프로그래머스 - 괄호 회전하기
- [Rust] 백준 1002 - 터렛
- [Node.js] 프로그래머스 - 크레인 인형뽑기 게임
- [Node.js] 프로그래머스 - 기능개발
- [Rust] 백준 13717 - 포켓몬 GO
- [JavaScript] 백준 1092 - 배
- [Rust] 백준 25329 - 학생별 통화 요금 계산
[Node.js] 백준 1254 - 팰린드롬 만들기
들어가기 전에
팰린드롬 == “회문”
거꾸로 읽어도 제대로 읽는 것과 같은 문장이나 낱말, 숫자, 문자열
e.g. : eye
이해
문자열이 주어지면, S 뒤에만 문자를 추가해서 가장 짧은 팰린드롬을 만들자
S = “abacaba”는 이미 팰린드롬이니 추가할 필요 없음. 길이 7이 최소가 된다.
S = “abab”는 abab 뒤에 a를 추가하면 ababa가 되어 팰린드롬이 되고, 길이는 5가 된다.
조건상 이게 가장 짧은 팰린드롬의 길이.
접근
틀렸던 접근
양쪽에서 들어오면서 일치하지 않으면, 그냥 바로바로 뒤에 추가하자 -> 가장 짧은걸 보장하지 않을 것 같음…
아무튼 구현해보니까 안되는 이슈 발생
제대로 된 접근
주어진 문자열 S의 뒤에서 부터 팰린드롬을 이루는 가장 긴 “부분”을 찾는 것
=> 그 이후에는, 해당 부분에 해당하지 않는 길이 만큼을 추가하면 팰린드롬이 된다!
즉
문자열 S에서 맨 앞 글자를 하나씩 제거하면서 남은 뒷부분이 팰린드롬이 되는지 확인한다.
코드
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim();
const ans = input.length;
// 팰린드롬을 판별
function isPalindrome(str) {
const reversedStr = str.split("").reverse().join(""); // 문자열 뒤집기
return str === reversedStr;
}
// input 문자열의 각 '접미사'가 팰린드롬인지 확인
for (let i = 0; i < input.length; i++) {
// input.substring(i)는 input의 i번째 인덱스부터 끝까지의 부분 문자열
if (isPalindrome(input.substring(i))) {
// 팰린드롬이라면,
// 원래 문자열 길이 + 팰린드롬이 아닌 앞부분의 길이 i
console.log(ans + i);
break;
}
}
결론
아…
구현 자체는 어렵지 않았지만 생각하는 과정이 너무 어려웠다
왜 다들 팰린드롬을 이렇게 좋아하지?
