본문 바로가기

백준/실버

[백준 5177번] 출력 형식이 잘못되었습니다 (C++)

문제링크 : https://www.acmicpc.net/problem/5177

#include <bits/stdc++.h> 
using namespace std;

int k;
string s1, s2;

string func(string s)
{
	for (int i = 0; i < s.size(); i++)
	{
		if ('A' <= s[i] && s[i] <= 'Z') { s[i] = tolower(s[i]); }  //대문자를 소문자로
		else if ((s[i] == '[') || (s[i] == '{')) { s[i] = '('; }   //'('로 통일
		else if ((s[i] == ']') || (s[i] == '}')) { s[i] = ')'; }   //')'로 통일
		else if (s[i] == ';') { s[i] = ','; }                      //':' -> ','
	}

	for (int i = 1; i < s.length(); i++)  //공백이 2개 이상일때 공백 지우기
	{                                     //공백 한칸만 냅두기
		char a = s[i - 1], b = s[i];

		if (a == ' ' && b == ' ')
		{
			s.erase(s.begin() + i);
			i--;
		}
	}

	while (s.length() >= 1 && s[0] == ' ')  //문자열 맨앞부분이 공백이면 지우기
		s.erase(s.begin());

	while (s.length() >= 1 && s[s.length() - 1] == ' ')  //문자열 맨뒷부분이 공백이면 지우기
		s.pop_back();

	for (int i = 1; i < s.length(); i++)  //특수문자 앞이나 뒤가 공백이면 지우기
	{
		char a = s[i - 1], b = s[i], c = s[i + 1];

		if (a < 'A' && b == ' ')
		{
			s.erase(s.begin() + i);
			i--;
		}

		else if (b == ' ' && c < 'A')
		{			
			s.erase(s.begin() + i);
			i--;
		}
	}
	return s;
}

int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	cin >> k;
	cin.ignore();
	for (int i = 1; i <= k; i++)
	{
		getline(cin, s1);
		getline(cin, s2);
		if (func(s1) == func(s2))  //같으면 equal 다르면 not equal
		{
			cout << "Data Set " << i << ": equal" << "\n";
			cout << "\n";
		}
		else
		{
			cout << "Data Set " << i << ": not equal" << "\n";
			cout << "\n";
		}
	}
}

공백도 입력받아야 하기에 getline을 통해 입력받는다.

각 조건에 대해 순차적으로 푸는게 꼬이지 않고 풀 수 있었다.

erase 함수를 통해 공백을 문자열에서 지우는 작업을 했다.

C++로 문자열 관련한 문제를 풀때마다 느끼는 거지만 귀찮고 복잡한 문제가 많다..