문제 링크
https://www.acmicpc.net/problem/5177
문제
지금껏 문제를 풀면서 출력 형식 오류 메시지를 본 적이 있을 것이다.
출력 형식 오류는 답은 적절히 맞았으나 공백 설정이 잘못되었거나, 일부 답안에 대해 자칫 지나치기 쉬운 사소한 오타를 냈을 때 볼 수가 있다.
이번 기회에 출력 형식 오류를 직접 잡아내는 프로그램을 작성해보면서 출력 형식 오류에 대한 이해도를 높이고 실수를 줄여보도록 하자.
프로그램은 두 개의 문자열을 비교하여 두 문자열이 출력 형식을 감안하면 같은 문자열인지, 혹은 그냥 서로 다른 문자열인지를 판정해야 한다.
프로그램에 입력되는 문자열은 다음의 문자들로만 이루어져 있다.
- 대문자 혹은 소문자 영문 알파벳
- 숫자
- 공백 (탭이 아닌 스페이스바)
- 특수 부호
특수 부호의 목록은 아래와 같다.
( ) [ ] { } . , ; :
출력 형식만 다른 문자열인지는 아래의 규칙에 따라 판정한다.
- 알파벳 대문자와 소문자는 구별하지 않는다.
- 공백이 하나 이상이라면, 공백의 크기는 관계없다. 물론 어떤 문자열엔 공백이 있고 어떤 문자열엔 공백이 없는 것, 즉 공백 유무의 차이 자체는 문제가 된다.
- 문자열의 맨 앞 혹은 맨 뒤에 나타나는 공백은 있으나 없으나 관계없다.
- 특수 부호의 바로 앞이나 바로 뒤에 나오는 공백도 있으나 없으나 상관없다.
- 여는 괄호끼리는 종류를 구별하지 않는다.
- 닫는 괄호끼리는 종류를 구별하지 않는다.
- 쉼표(",")와 세미콜론(";")은 구별하지 않는다.
입력
첫 줄에 테스트 케이스의 수 K가 주어진다.
이어 두 줄에 걸쳐 문자열 s1과 문자열 s2가 주어진다.
각 문자열의 길이는 1000 이하이다.
개행 문자는 문자열에 포함되지 않는다.
출력
각 테스트 케이스마다, Data Set K: 를 출력한 뒤
만일 두 문자열이 출력 형식을 감안했을 때 동일한 문자열이라면 equal을, 출력 형식을 잘 조작해도 서로 다른 문자열이라면 not equal을 출력한다.
각 테스트 케이스의 사이엔 빈 줄을 하나 출력한다.
예제 입력 1
3
( 1, 4 ) (2,3) (2,4)
{ 1; 4 ) {2;3) {2;4)
Data Set 1: equal
data set 1 : EQUAL
Data Set 1: equal
DataSet 1: equal
예제 출력 1
Data Set 1: equal
Data Set 2: equal
Data Set 3: not equal
알고리즘 분류
- 문자열
풀이
우선 대문자는 소문자로 바꾸고, 여는 괄호는 '('로 통일하고 닫는 괄호는 ')'로 통일하고, 여러 칸의 공백은 한 칸으로 줄이고, 세미콜론은 쉼표로 변경한다. 그리고 문자열의 앞 뒤 공백들을 전부 제거하고, 10개의 특수 부호 양 옆에 있는 공백도 전부 제거한다.(여러 칸의 공백을 이미 한 칸으로 줄여놨으므로 양 옆에 있는 공백만 확인하면 된다.)
마지막으로 전처리해둔 문자열 S1, S2를 비교해서 같다면 equal, 다르다면 not equal을 출력한다.
코드
#include <iostream>
#include <string>
#include <cmath>
#include <unordered_set>
#include <unordered_map>
#include <bitset>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#include <climits>
#define FASTIO cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#define MAX 50001
#define LL long long
#define INF 1e9
using namespace std;
int K;
string S1, S2;
/*
1. 알파벳 대문자, 소문자 구별X : 소문자로 통일
2. 공백이 하나 이상이라면 크기는 관계X : 공백이 있다면 한 칸으로 통일
3. 문자열의 맨 앞 혹은 맨 뒤에 나타나는 공백은 있으나 없으니 상관X : 없앰
4. 특수 부호의 바로 앞이나 바로 뒤에 나오는 공백도 있으나 없으나 상관X : 없앰
5. 여는 괄호끼리 종류 구별 X : '('로 통일
6. 닫는 괄호끼리는 종류 구별 X : ')'로 통일
7. 쉼표와 세미콜론은 구별 X : 쉼표로 통일
*/
string Func(string S) {
string res = S;
// 1, 2, 5, 6, 7번 작업
int spaceStart = -1;
int spaceEnd = -1;
for (int i = 0; i < res.size(); i++) {
if (spaceStart == -1) {
if ((res[i] >= 'A') && (res[i] <= 'Z')) {
res[i] += 32;
}
else if ((res[i] == '[') || (res[i] == '{')) {
res[i] = '(';
}
else if ((res[i] == ']') || (res[i] == '}')) {
res[i] = ')';
}
else if (res[i] == ';') {
res[i] = ',';
}
else if (res[i] == ' ') {
spaceStart = i;
}
}
else {
if (res[i] != ' ') {
spaceEnd = i - 1;
if (spaceStart != spaceEnd) {
int Sub = spaceEnd - spaceStart;
while (Sub--) {
res.erase(res.begin() + spaceStart);
i--;
};
}
i--;
spaceStart = -1;
spaceEnd = -1;
}
}
}
// 3번 작업
for (int i = 0; i < res.size(); i++) {
if (res[i] == ' ') {
res.erase(res.begin() + i);
i--;
}
else {
break;
}
}
for (int i = (res.size() - 1); i >= 0; i--) {
if (res[i] == ' ') {
res.pop_back();
}
else {
break;
}
}
// 4번 작업
for (int i = 0; i < res.size(); i++) {
if ((res[i] == '(') || (res[i] == ')') || (res[i] == '[') || (res[i] == ']') || (res[i] == '{') ||
(res[i] == '}') || (res[i] == '.') || (res[i] == ',') || (res[i] == ';') || (res[i] == ':')) {
if ((i > 0) && (res[i - 1] == ' ')) {
res.erase(res.begin() + (i - 1));
i--;
}
if ((i < (res.size() - 1)) && (res[i + 1] == ' ')) {
res.erase(res.begin() + (i + 1));
}
}
}
return res;
}
bool isSame(string A, string B) {
if (A == B) {
return true;
}
return false;
}
void Find_Answer(int Number, bool Flag) {
if (Flag) {
cout << "Data Set " << Number << ": equal\n";
cout << "\n";
}
else {
cout << "Data Set " << Number << ": not equal\n";
cout << "\n";
}
}
void Input() {
cin >> K;
cin.ignore();
for (int i = 1; i <= K; i++) {
getline(cin, S1);
getline(cin, S2);
bool Flag = isSame(Func(S1), Func(S2));
Find_Answer(i, Flag);
}
}
int main() {
FASTIO
Input();
return 0;
}
'BOJ > Silver' 카테고리의 다른 글
[BOJ/Silver 1] 백준 21737 SMUPC 계산기(C++) (0) | 2022.03.17 |
---|---|
[BOJ/Silver 2] 백준 22233 가희와 키워드(C++) (0) | 2022.03.16 |
[BOJ/Silver 3] 백준 20291 파일 정리(C++) (0) | 2022.03.15 |
[BOJ/Silver 1] 백준 19583 싸이버개강총회(C++) (0) | 2022.03.15 |
[BOJ/Silver 3] 백준 1058 친구(C++) (0) | 2022.02.12 |