[백준/BOJ] 1213. 팰린드롬 만들기 [Silver 4]

jychan99·2021년 10월 13일
0
post-thumbnail
  1. 팰린드롬 만들기

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

문제에서 중요한조건이 몇가지 있다.
1. 팰린드롬은 앞으로 읽어도 뒤로읽어도 똑같은 글을 뜻한다.
2. 영어이름은 알파벳 대문자로만 된 최대 50글자이다.
3. 정답이 여러 개일 경우 사전순으로 앞서는 것을 출력한다.

code

#include <stdio.h>
#include <string.h>
int main()
{
	char name[51] = { 0 }, alphabet[26] = { 0 }, cnt = 0, result[51] = { 0 };
	scanf("%s", name);
	int len = strlen(name);
	for (int i = 0; i < len; i++)
		alphabet[name[i] - 65]++;
	for (int i = 0; i < 26; i++)
		if (alphabet[i] % 2 == 1)
			cnt++;
	if (cnt >= 2)
		printf("I'm Sorry Hansoo");
	else
	{
		int j = 0;
			for (int i = 0; i < 26; i++)
			{
				if (alphabet[i] !=0 && alphabet[i]%2==0)
				{
					while (alphabet[i] != 0)
					{
						result[j] = i + 65;
						result[len - 1 - j] = i + 65;
						alphabet[i] -= 2;
						j++;
					}
				}
				else if (alphabet[i] != 1 && alphabet[i] % 2 == 1)
				{
					while (alphabet[i] != 1)
					{
						result[j] = i + 65;
						result[len - 1 - j] = i + 65;
						alphabet[i] -= 2;
						j++;
					}
				}
			}
			for (int i = 0; i < 26; i++)
			{
				while (alphabet[i] != 0)
				{
					result[j] = i + 65;
					alphabet[i]--;
					j++;
				}
			}
	}
	printf("%s", result);
	return 0;
}

일단 나는 알파벳이 26개니까 alphabet[26]이란 배열을 만들었다.
그리고 name배열에 입력받은 문자열을 돌면서 알파벳을 alphabet배열에 알맞는 인덱스로 ++해주었다.
예를들어 AABB이면 alphabet[0] =2, alphabet[1] =2, alphabet[3]=0...이런식으로

여기서 중요한데, 팰린드롬을 만들려면 2개이상의 홀수개인 문자가 오면 안된다.
그니까 AAABB는 되는데 AAABC는 안된다는 뜻이다.

그래서 나는 alphabet배열을돌면서 홀수개이면 cnt++를 해줘서 cnt가 2이상이면 I'm Sorry Hansoo를 출력하고 아니면 계속 진행하도록짯다.

사전순으로 앞서게 출력해야하므로 alphabet배열을 처음부터 돌면서 result배열 인덱스 처음과 끝에 각각넣어준다. 만약 홀수개인 문자가 1이아닌 3이상이면 1개만 남기고 양끝에 넣어준다.
그렇게 다넣어주고, 홀수개문자 1개가 남은것은 가장 정중앙에 넣어주면 팰린드롬이 된다.

나는 여러 시행착오를 거쳐서 맞춘거라 마지막코드가 좀 쓸데없이 긴것 같은데 굳이 while문안돌고 if문을넣어도 될것같다.

profile
내가 지금 두려워 하고 있는 일이 바로 내가 지금 해야 할 일이다. 🐥

0개의 댓글