https://www.acmicpc.net/problem/15927
안녕하세요. 오랜만에 한 번에, 실수 없이, 빠른 시간에 맞은 골드 문제입니다.
문제는 간단합니다.
문자열을 입력받아서 팰린드롬이 아닌 부분의 길이를 출력하면 되는 것입니다.
예제 1번 보시면 ABCBA는 팰린드롬이죠?
앞이나 뒤에서 A를 빼면 팰린드롬이 아닙니다.
AABBAA 팰린드롬, 앞이나 뒤에서 빼면 아닙니다.
감이 오셨나요?
일단 제일 앞, 뒤에서 부터 하나씩 짝을 지어서 문자를 검사해줍니다.
이렇게 검사를 했을 때 전부 똑같다면 팰린드롬이겠죠.
저는 문자열의 길이 / 2 만큼 검사를 해줬는데요, 단어가 홀수인 경우에도 문제가 되지 않습니다.
어차피 앞에서부터 전부 똑같았다면 가운데의 문자는 어떻든 팰린드롬이기 때문이죠.
만약 팰린드롬이라면 앞이나 뒤에서 하나만 빼줘도 팰린드롬이 아니게 됩니다. 어떤 팰린드롬도 이 공식은 적용됩니다.
이렇게 해서
팰린드롬이라면 : 문자열 길이 - 1
팰린드롬이 아니라면 : 문자열 길이
전부 똑같다면 : -1
을 출력해주면 됩니다.
반례 알려드릴게요
ABABABABA
8
ABABABAB
8
ABCABCABC
9
BBBBBBBBBBBBBBBBBABBBBBBBBBBBBBBBBBABBBBBBBBBBBBBBBBB
52
BBBBBBBBBBBBBBBBBABBBBBBBBBBBBBBBBB
34
BBBBBBBBBBBBBBBBBABBBBBBBBBBBBBBBBBB
36
제 코드 알려드릴게요
#include <stdio.h>
#include <string.h>
int main() {
char s[500000] = {};
int check = 0;
scanf("%s", s);
for(int i = 0; i < strlen(s)/2; i++) {
if(s[i] != s[strlen(s) - 1 - i]) {
check = 1;
}
}
int same = 1;
for(int i = 0; i < strlen(s) - 1; i++) {
if(s[i] != s[i + 1]) same = 0;
}
if(same == 1) printf("-1");
else if(check == 1) printf("%lu", strlen(s));
else if(check == 0) printf("%lu", strlen(s) - 1);
}
'백준' 카테고리의 다른 글
[C++/C언어] 백준 | 4344번 평균은 넘겠지 (0) | 2022.05.25 |
---|---|
2022 서강대학교 청정수컵 36위 기념 문제풀이 (0) | 2022.05.21 |
[C언어/C++] 1920번 수 찾기 + 반례 모음 (0) | 2022.05.09 |
[C언어/C++] 14370번 전화번호 수수께끼 (Large) + 반례 모음 (2) | 2022.05.08 |
[C언어] 백준 | 17404번 RGB거리 2 (0) | 2022.04.29 |