이 포스팅은 Shubham Chaudhary 가 작성한 문서를 참조해서 작성했습니다.
문제
문자열 s
가 주어졌을때 s
에 문자를 붙여서 (끝 부분에 삽입한다 생각) 회문(palindrome)을 만들 수 있는 최소의 문자 갯수를 찾아라.
예시
Input : s = "abede"
Output : 2
"abedeba" 로 회문을 만들 수 있습니다. 끝에 ba 를 추가했습니다.
Input : s = "aabb"
Output : 2
"aabbaa" 로 회문을 만들 수 있습니다. 끝에 aa 를 추가했습니다.
정답
문제와 달리 정답은 정 반대로 접근합니다.
솔루션은 다음과 같습니다 :
문자열의 가장 처음부터 하나씩 제거하고 그 문자열이 회문인지 확인합니다.
예를 들자면, 문자열 s = "abede" 을 생각해보세요.
처음엔 일단 주어진 문자열이 회문인지 아닌지 검사합니다.
만약 회문이 아니라면, 문자열중에 가장 첫번째 문자를 지웁니다.
이렇게 되면 문자열 s 는 "bede" 가 됩니다.
이제 또 문자가 회문인지 아닌지 검사합니다. 회문이 아니라면, 문자열중에 가장 첫번째 문자를 지웁니다.
이렇게 되면 문자열 s 는 "ede" 가 됩니다.
이제는 눈으로 봐도 문자열이 회문인지 알 수 있습니다.
즉, 처음 문자열 s 에서 회문이 되기위해 붙여야 하는 최소 문자 개수는 2개 입니다.
아래는 C 로 작성한 솔루션 입니다.
// 회문이 되기위해 붙여야 하는 최소 문자 개수를 찾는 C 프로그램
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
// 문자열이 회문인지 아닌지 검사한다.
bool isPalindrome(char *str)
{
int len = strlen(str);
// 1개의 문자는 언제나 회문입니다.
if (len == 1)
return true;
// 첫번째 문자의 pointer를 가져옴
char *ptr1 = str;
// 마지막 문자의 pointer를 가져옴.
char *ptr2 = str+len-1;
while (ptr2 > ptr1)
{
if (*ptr1 != *ptr2)
return false;
ptr1++;
ptr2--;
}
return true;
}
// 붙여야 하는 문자를 세는 재귀 함수
int noOfAppends(char s[])
{
if (isPalindrome(s))
return 0;
// 포인터 주소값을 증가시켜서
// 문자열의 첫번째 문자를 제거한다.
s++;
return 1 + noOfAppends(s);
}
// 테스트를 위한 드라이버 프로그램
int main()
{
char s[] = "abede";
printf("%d\n", noOfAppends(s));
return 0;
}
출력값
2
조금 더 어려운 회문 문제를 곧 포스팅 하도록 하겠습니다.
'프로그래밍' 카테고리의 다른 글
[DP] Palindrome, 팰린드롬(회문) 만들기 - 2부 (0) | 2018.02.15 |
---|---|
[DP] LCS(Longest Common Subsequence) 찾기 (0) | 2018.02.14 |
[DP] 게임을 위한 최적의 전략 (1) | 2018.02.13 |
python 의 변경가능(Mutable) vs 변경불가능(Immutable) 객체들 (0) | 2018.02.13 |
[DP] 부분집합의 합 구하기 (Subset Sum Problem) (0) | 2018.02.11 |