[Baekjoon(백준)][9996번] 한국이 그리울 땐 서버에 접속하지(C++)
안녕하세요! 오늘은 코딩테스트 문제 중 하나인 "한국이 그리울 땐 서버에 접속하지" 문제를 해결하는 방법에 대해 설명하려고 합니다. "한국이 그리울 땐 서버에 접속하지" 문제는 주어진 패턴에 일치하는 파일 이름을 찾아내는 것입니다. 문제를 해결하는 과정과 코드를 자세히 알아보겠습니다.
문제링크:
https://www.acmicpc.net/problem/9996
9996번: 한국이 그리울 땐 서버에 접속하지
총 N개의 줄에 걸쳐서, 입력으로 주어진 i번째 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력한다. 참고로, "DA"는 크로아티어어로 "YES"를, "NE"는 "NO"를 의미한다.
www.acmicpc.net
문제 개요
해외에서 생활하는 동안 서버에 저장된 파일 이름을 통해 한국을 떠올리려는 이야기에서 출발한 이 문제는, 주어진 패턴과 일치하는 파일 이름을 찾는 과제입니다. 패턴은 알파벳 소문자와 단 하나의 별표(*)로 구성되며, 별표는 임의의 문자열(빈 문자열 포함)로 대체될 수 있습니다.
해결 방법
다. 별표 앞뒤의 문자열로 파일 이름이 시작하고 끝나는지를 검사하여 패턴에 일치하는지 여부를 판단합니다. 별표는 파일 이름 중간에 위치할 수 있는 어떤 문자열로도 대응될 수 있습니다.
코드 구현
#include <iostream>
#include <vector>
using namespace std;
// 문자열을 주어진 구분자(del)로 분할하는 함수
vector<string> Split(string input, string del) {
vector<string> ret;
string token = "";
int pos = 0;
while ((pos = input.find(del)) != string::npos) {
token = input.substr(0, pos); // 구분자 이전까지의 문자열을 추출
ret.push_back(token); // 추출된 문자열을 벡터에 저장
input.erase(0, pos + del.size()); // 처리된 부분을 입력 문자열에서 제거
}
ret.push_back(input); // 마지막 남은 문자열을 벡터에 추가
return ret;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int count = 0; // 파일의 개수
cin >> count;
string pattern = ""; // 패턴 문자열
cin >> pattern;
vector<string> inputs(count, ""); // 파일 이름을 저장할 벡터
for (int i = 0; i < count; i++) {
cin >> inputs[i]; // 파일 이름 입력
}
// 패턴을 '*' 기준으로 분할하여 패턴의 시작 부분과 끝 부분을 추출
vector<string> ret = Split(pattern, "*");
vector<string> answer; // 각 파일 이름이 패턴과 일치하는지 여부를 저장할 벡터
for (int i = 0; i < inputs.size(); i++) {
// 파일 이름의 길이가 패턴의 시작 부분과 끝 부분의 길이 합보다 작으면 일치하지 않음
if (ret[0].size() + ret[1].size() > inputs[i].size()) {
answer.push_back("NE");
}
else {
// 파일 이름의 시작 부분이 패턴의 시작 부분과 일치하고
// 파일 이름의 끝 부분이 패턴의 끝 부분과 일치하면 패턴과 일치함
if (ret[0] == inputs[i].substr(0, ret[0].size()) &&
ret[1] == inputs[i].substr(inputs[i].size() - ret[1].size())) {
answer.push_back("DA");
}
else {
answer.push_back("NE");
}
}
}
// 결과 출력
for (auto str : answer) {
cout << str << "\n";
}
}
코드 설명
이 코드는 주어진 패턴을 '*' 기준으로 분할하여 시작 부분과 끝 부분을 추출합니다. 각 파일 이름에 대해 시작 부분과 끝 부분이 일치하는지 검사하여 패턴과의 일치 여부를 판단합니다. 패턴이 일치하면 "DA"를, 그렇지 않으면 "NE"를 출력합니다.
결론
이 문제는 문자열 처리와 조건 판단을 통해 해결할 수 있으며, 복잡한 알고리즘보다는 기본적인 프로그래밍 능력을 평가합니다. 별표(*)를 포함한 패턴 매칭은 다양한 프로그래밍 문제에서 자주 접할 수 있는 주제이므로, 이러한 유형의 문제에 익숙해지는 것이 중요합니다.