[알고리즘/문제] 백준 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처럼 반례를 위해 미리 예외처리를 하는 것도 중요한 것 같다.
'프로그래밍 > 알고리즘 문제' 카테고리의 다른 글
| [알고리즘/문제] 백준 1620번: 나는야 포켓몬 마스터 이다솜 (C++) (1) | 2024.03.05 |
|---|---|
| [알고리즘/문제] 백준 2559번: 수열 (C++) (0) | 2024.03.05 |
| [알고리즘/문제] 백준 11655번: ROT13 (C++) (0) | 2024.03.02 |
| [알고리즘/문제] 백준 1159번: 농구경기 (C++) (0) | 2024.03.02 |
| [알고리즘/문제] 백준 10988번: 팰린드롬인지 확인하기 (C++) (0) | 2024.03.02 |