Problem Solving/백준

[백준/c++] 15927 - 회문은 회문아니야!!

세고래 2021. 3. 27. 23:12

https://www.acmicpc.net/problem/15927

 

15927번: 회문은 회문아니야!!

팰린드롬이란 앞으로 읽으나 뒤로 읽으나 같은 문자열을 말한다. 팰린드롬의 예시로 POP, ABBA 등이 있고, 팰린드롬이 아닌 것의 예시로 ABCA, PALINDROME 등이 있다. 같은 의미를 가지는 여러 단어들을

www.acmicpc.net


1) 풀이

뭔가 풀이방법은 알겠는데, 자꾸 틀려서 애를 먹었던 문제!

이 방법이 맞는 것 같은데, 며칠을 풀어도 자꾸 틀렸다거나, 시간초과가 떠서 답답해서 다른 분들의 풀이를 찾아보았다.

결론적으로 내가 생각한 방법이 맞지만, 인덱스 접근에서나 케이스마다 처리해주는 방식에서 조금 오류가 있었던 것 같다!!!!!!! 그래두 푼 게 어디야 ~

내가 참고한 블로그는 아래 참고자료에 첨부해두겠다용

 

0. 입력받은 문자열이 회문인지 아닌지 확인

»문자열의 문자들을 확인할 반복문을 만든다. 문자열의 맨 처음과 맨 끝을 먼저 비교해주는데, 앞쪽은 인덱스를 늘리고, 뒤쪽은 인덱스를 줄여가며 마치 중앙으로 모이는 듯한 모양으로 문자들을 비교해준다. 

 

1. 문자열이 회문이 아닌 경우

»0과 같은 과정으로 비교했을 때, 두 문자가 서로 다르면 회문이 아닌 경우이므로 그대로 문자열 전체 길이를 출력하고 종료한다.

 

2. 문자열이 회문인 경우

2-1. 문자열이 모두 같은 문자로 이루어진 경우

: 회문이 아닌 경우가 존재하지 않으므로 -1을 출력한다.

2-2. 문자열이 모두 같은 문자는 아니지만, 회문인 경우

: 원래의 문자열에서 하나의 문자만 빼면 그 문자열은 회문이 아니다. 즉, 문자열 길이에서 1을 빼고 출력한다.

 

»문자열 내의 모든 문자를 확인하는 반복문을 만들고, 다른 문자가 한개라도 나올 경우 1-2로 처리하고 프로그램을 바로 종료한다. 반복문이 빠져나오면, 문자열 내의 모든 문자가 같다는 의미이므로 -1을 출력한다.

 

적고 보니 설명이 이해가 어려울 수도 있겠다는 생각이 든다.

코드를 함께 확인해보면 좋겠다!

 

2) 최종 소스코드
#include <bits/stdc++.h>
using namespace std;
string str;
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> str;
	for (int i = 0; i < str.length() / 2; i++) { //회문인지, 아닌지를 판단
		if (str[i] != str[str.length() - 1 - i]) {//다르면, 회문 아님
			cout << str.length() << '\n';
			return 0;
		}
	}
	//회문인 경우
	char fir = str[0]; //0번째 인덱스의 문자와 비교해서 반복문을 빠져나간다면, 모두 같은 문자로 이루어진 문자열
	for (int i = 1; i < str.length(); i++) { 
		if (fir != str[i]) { //서로 다른 문자열로 이루어진 회문
			cout << str.length() - 1 << '\n';
			return 0;
		}
	}
	cout << -1 << '\n';
}
3) 참고자료

degurii.tistory.com/39

728x90