[알고리즘/문제] 백준 9996번: 한국이 그리울 땐 서버에 접속하지 (C++)

    목차

https://www.acmicpc.net/problem/9996

 

9996번: 한국이 그리울 땐 서버에 접속하지

총 N개의 줄에 걸쳐서, 입력으로 주어진 i번째 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력한다. 참고로, "DA"는 크로아티어어로 "YES"를, "NE"는 "NO"를 의미한다.

www.acmicpc.net

 

이번 문제는 틀린 코드부터 올린다.

#include <iostream>
#include <string>

using namespace std;

int n;
string pattern, name;

int main() {
	cin >> n;
	cin >> pattern;

	for (int i = 0; i < n; i++) {
		cin >> name;
		if (name[0] == pattern[0] && *(name.end()-1) == pattern[2]) cout << "DA" << endl;
		else cout << "NE" << endl;
	}

	return 0;
}

 

맨 처음에는 코드를 이렇게 써서 제출했다.

이 코드에는 두가지 문제가 있었다.

1. 다음과 같이 입력을 받을때마다 출력이 됐다.

파이썬에서는 for문안에 입력과 출력이 있어도 잘 됐었는데, C++에서는 안되는 것 같다.

 

2. 테스트 케이스를 꼼꼼하게 살피지 못했다.

a*b 와 같은 경우에는 해결이 가능하지만

ab*ab와 같은 경우에는 해당 코드로는 해결이 안된다.

문제에 따로 앞 뒤 글자가 한글라는 것이 명시가 안되어 있기 때문에 모든 경우를 따져야 한다.

(문제 설명이 너무 N인 사람이 쓴거 같긴함..)

 

그래서 *을 찾아서 앞과 뒤로 나누고 앞 토큰과 뒤 토큰을 각각 비교해 일치하는 코드를 써보려고 했다.

#include <iostream>
#include <string>

using namespace std;

int n;
string pattern, pre, suf, fileName;

int main() {
	cin >> n;
	cin >> pattern;
	int pos = pattern.find('*');
	pre = pattern.substr(0, pos);
	suf = pattern.substr(pos + 1);
	for (int i = 0; i < n; i++) {
		cin >> fileName;
		if (pre.size() + suf.length() > fileName.length()) cout << "NE\n";
		else{
			if (pre == fileName.substr(0, pre.length()) && suf == fileName.substr(fileName.length() - suf.length())) cout << "DA\n";
			else cout << "NE\n";
		}

	}

	return 0;
}

 

substr과 find를 활용해 문자열을 다루는 방법을 이번 문제에서 잘 배운 것 같다.

보니까 아까 문제라고했던 1번은 문제가 되지 않는 것 같다.

첫번째 if처럼 반례를 위해 미리 예외처리를 하는 것도 중요한 것 같다.