문제링크 : 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++로 문자열 관련한 문제를 풀때마다 느끼는 거지만 귀찮고 복잡한 문제가 많다..
'백준 > 실버' 카테고리의 다른 글
[백준 2841번] 외계인의 기타 연주 (C++) (0) | 2023.02.05 |
---|---|
[백준 25644번] 최대 상승 (C++) (0) | 2023.02.05 |
[백준 3135번] 라디오 (C++) (0) | 2023.02.05 |
[백준 13706번] 제곱근 (python) (0) | 2023.02.05 |
[백준 14494번] 다이나믹이 뭐에요? (C++) (0) | 2023.02.05 |