본문 바로가기
알고리즘/백준-실버

백준 1213번 팰린드롬 만들기(C++)

by 뜨거운 개발자 2022. 12. 30.

문제

정답 코드

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

char result[52];
int	a,b;
int	next_two_same(char a,char b)
{
	return (a == b);
}

int main()
{
	string s;
	cin >>s;
	sort(s.begin(), s.end());
	b = s.size() - 1;
	int	num = 1;
	int flag =0;
	int i =0;
	while (i < s.size())
	{
		if (i + 1 >= s.size())
		{
			result[a] = s[i];
			if (flag)
			{
				cout << "I'm Sorry Hansoo\n";
				return (0);
			}
		}
		if (next_two_same(s[i],s[i+1]))
		{
			result[a] = s[i];
			result[b] = s[i];
			a++;
			b--;
			i+= 2;
		}
		else
		{
			if (flag)
			{
				cout << "I'm Sorry Hansoo\n";
				return (0);
			}
			result[s.size()/2] = s[i];
			flag = 1;
			i++;
		}
	}
	cout << result;
}

문제 풀이의 흐름

  1. 펠린드롬은 앞뒤로 같은 대칭 구조를 이루기 때문에 큰 배열을 선언해두고 앞 뒤로 붙혀가면서 사용하고자 생각을 했다.
  1. 따라서 문자를 쭉 받아서 그 문자를 순서대로 정렬을 먼저 해줬다
  1. 이 후 펠렌드롬 문자열을 받을 배열인 result에 string을 쭉 돌면서 값을 넣어줄 것이다.
  1. 현재 문자열에서 뒤의 두개의 문자가 같으면 result배열에 앞과 뒤에 넣어줬다.
  1. 만약 문자열의 크기가 넘어가는 경우 즉 문자가 1개인 경우나 AAB이렇게 되는 경우에는 while 루프 첫번째 조건문에 걸리게 된다.
  1. 우리는 홀수인 경우는 오로지 한번만 발생해야하니까 flag를 줘서 만약 홀수갯수인 문자가 나오면 가운데에 넣어주고 또 다시 한번 홀수인 문자가 나오면 즉시 종료 하면서 에러 메세지를 띄운다.

주의 할 점

꽤나 빡구현이었다. 자꾸 헷갈리고 조금 더 간단하게 생각을 정리하고 했어야하는데 자꾸 부딪치면서 코드가 엄청 길어졌었다. 먼저 아이디어를 컴퓨터가 생각하는 것 처럼 간단하게 정리를 하고 코드를 짜는걸 추천한다.

문자열을 잘못 넣지 않게 주의하자!

반성 및 고찰

안풀려서 버린 코드

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

char result[52];
int main()
{
	string s;
	cin >>s;
	sort(s.begin(), s.end());
	char bef = 0;
	int cnt = 0;
	int front= 0;
	int last = s.size() - 1;
	int flag =0;
	int	i = 1;
	// cout << s;
	for (auto it : s)
	{
		if (i == s.size() -1 || (cnt != 0 && bef != it))
		{
			if (flag == 1 && cnt % 2 != 0)
			{
				cout << "I'm Sorry Hansoo";
				return (0);
			}
			else
			{
				while (cnt >0)
				{
					if (cnt == 1)
					{
						result[s.size()/2] = bef;
						flag = 1;
						cnt = 0;
					}
					else
					{
						result[front] = bef;
						front++;
						result[last] = bef;
						last--;
						cnt -=2;
					}
				}
			}
		}
		cnt++;
		bef = it;
		i++;
	}
	for (int i=0; i < 4; i++) cout << result[i];
	cout << result;
}

너무 많은 변수를 쓰고 자꾸 기워가면서 코드를 짜다보니 아에 지우고 다시 풀어버렸다. 꼭 생각정리를 잘 하고 풀자 사실상 빡구현에 가깝다.


Uploaded by N2T

728x90