문제출처: https://www.acmicpc.net/problem/8892


문제

팰린드롬은 어느 방향으로 읽어도 항상 같은 방법으로 읽을 수 있는 단어이다. 예를 들어, civic, radar, rotor, madam은 팰린드롬이다.

상근이는 단어 k개 적혀있는 공책을 발견했다. 공책의 단어는 ICPC 문제가 저장되어 있는 서버에 접속할 수 있는 비밀번호에 대한 힌트이다. 비밀번호는 k개의 단어 중에서 두 단어를 합쳐야 되고, 팰린드롬이어야 한다. 예를 들어, 단어가 aaba, ba, ababa, bbaa, baaba일 때, ababa와 ba를 합치면 팰린드롬 abababa를 찾을 수 있다.

단어 k개 주어졌을 때, 팰린드롬을 찾는 프로그램을 작성하시오.


입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 공책에 적혀져있는 단어의 수 k(1 ≤ k ≤ 100)가 주어진다. 다음 k개 줄에는 a부터 z까지 알파벳으로 이루어진 단어가 한 줄에 하나씩 주어진다. 모든 단어 길이의 합은 10,000보다 작거나 같다.


출력

각 테스트 케이스마다 팰린드롬을 출력한다. 만약, 가능한 팰린드롬이 여러 가지라면 아무거나 출력한다. 팰린드롬을 만들 수 없는 경우에는 0을 출력한다.


풀이

string을이용해서 풀었습니다. string 배열에 값을 입력하고, 팰린드롬일때 ,아닐 때 의 값을출력하는 함수, 팰린드롬진위여부 확인함수 2개를 이용합니다. 코드를 보면 이해가 쉬울것이고, 주의해야할 것은 33행과 35행의 변수선언입니다. ba,ababa일때 ba와 ababa만 비교하고 ababa와 ba를 비교하지않으면(예를들어 버블정렬처럼 변수 선언 시) 0이 출력됩니다. 그리고 37행은 같은 문자열은 무조건 팰린트롬이 될 수 없으므로 연산을 건너뛰게해줍니다.


코드

#include<iostream>
#include<string>
using namespace std;
string s[100];
void func1();
bool func2(string x);
int k;
int main()
{
	cin.tie(0); cin.sync_with_stdio(false);
	int t;
	cin >> t;
	while (t--)
	{
		func1();
	}
}
bool func2(string x)
{
	for (int i = 0; i < x.size() / 2; i++)
	{
		if (x[i] != x[x.size() - i - 1])
			return false;
	}
	return true;
}
void func1()
{
	cin >> k;
	for (int i = 0; i < k; i++)
		cin >> s[i];

	for (int i = 0; i < k ; i++)
	{
		for (int j = 0; j < k; j++)
		{
			//i==j면 같은 글자이므로 절대 불가능
			if (i == j)continue;
			//팰린드롬이면
			if (func2(s[i] + s[j]))
			{
				cout << s[i] + s[j] << '\n';
				return;
			}
		}
	}
	//다 비교했는데도 팰린드롬아니면 0출력
	cout << 0 << '\n';
}


결과






+ Recent posts