※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 14970번 문제인 Almost Identical Programs이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/14970
주어진 두 문자열이 같으면 IDENTICAL을 출력하면 된다는 점을 확인하자. 아래에서는 두 문자열이 다른 경우만을 생각한다.
따옴표의 개수가 같지 않다면 둘은 같을 수가 없다는 점을 관찰하자. 또한 따옴표의 개수가 같은 경우, (올바른 순서를 구성하는) 두 따옴표 사이에 포함된 문자열의 쌍 중 한 쌍만 다른 경우만 답이 CLOSE가 됨을 관찰하자.
위 관찰을 그대로 구현해 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
using namespace std;
string s1, s2, ss1, ss2, tmp;
vector<string> v1, v2;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
while (getline(cin, s1) && getline(cin, s2)) {
if (s1 == s2) cout << "IDENTICAL\n";
else {
ss1.clear(), ss2.clear(), v1.clear(), v2.clear();
int sgn = 0;
tmp.clear();
for (auto &l:s1) {
if (l == '\"') {
sgn ^= 1;
if (!sgn) v1.emplace_back(tmp), tmp.clear();
ss1 += '\"';
}
else if (sgn) tmp += l;
else ss1 += l;
}
sgn = 0;
tmp.clear();
for (auto &l:s2) {
if (l == '\"') {
sgn ^= 1;
if (!sgn) v2.emplace_back(tmp), tmp.clear();
ss2 += '\"';
}
else if (sgn) tmp += l;
else ss2 += l;
}
if (ss1 != ss2 || v1.size() != v2.size()) cout << "DIFFERENT\n";
else {
int cnt = 0, vsize = v1.size();
for (int i = 0; i < vsize; i++) {
if (v1[i] != v2[i]) cnt++;
}
if (cnt > 1) cout << "DIFFERENT\n";
else cout << "CLOSE\n";
}
}
}
}
728x90