[Algorithm] 9996 한국이 그리울 땐 서버를 접속하지

gunggme·2023년 11월 19일

알고리즘

목록 보기
11/42

시작

우선 밑에 있는 코드를 보았다면 난 cpp의 기본 라이브러리는 string과 iostream만 사용했다는 것을 알 수 있는데, 그 이유는 내가 기본 라이브러리들에 대한 지식이 부족하다는 것이다..(강의 보면서 find랑 sub_str을 알게됨) 그렇게 되어 코드의 수가 남달라지게 되는데, 그래도 속도는 4ms로? 생각보다 빠르게 나왔다. 그렇다면, 한번 알고리즘을 짜보자.

알고리즘

  1. 문자열을 입력받는다.
  2. 입력받은 문자열에서 크기가 벗어나면 NE를 출력
  3. 벗어나지 않는다면, 앞에서 부터 체크하는데, 틀리면 NE출력, 만약 맞으면 DA출력

이런식으로 한번 간단하게 알고리즘을 짜보았는데, 필자는 이 간단한 알고리즘도 한번에 성공을 못했다.. :(

이렇게 연속 7번을 틀기고, 한번 성공했는데, 어떻게 긴 코드를 가지고 해결했는지도 의문이다.

코드

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>

using namespace std;

int main() {
	string s;
	int a, sSize = 0, result = 0;
	cin >> a;
	cin >> s;
	sSize = s.size() - 1;

	for (int i = 0; i < a; i++) {
		string c;
		result = 0;
		cin >> c;
		//vector<int> cSize(c.size());
		if (c.size() >= sSize) {
			for (int j = 0; j < c.size(); j++) {
				// 별표면 끊기
				if (s[j] == '*') break;
				// 틀리면 끊기
				if (s[j] != c[j]) {
					result = 0;
					break;
				}

				//맞으면 카운트
				if (s[j] == c[j]) {
					result++;
				}
			}
			for (int k = 0; k < c.size(); k++) {
				// 앞에서 틀렸으니 끊기
				if (result == 0) {
					break;
				}
				// 별이면 끊기
				if (s[s.size() - k] == '*') break;
				// 뒷부분에서 틀리면 끊기
				if (s[s.size() - k] != c[c.size() - k]) {
					result = 0;
					break;
				}
				// 맞으면 카운트
				if (s[s.size() - k] == c[c.size() - k]) {
					result++;
				}
			}
		}
		// 틀렸으니 NE출력후 다음으로 넘어가기
		if (result == 0) {
			cout << "NE\n";
			continue;
		}
		cout << "DA\n";
	}
	

}
profile
안녕하세요!

0개의 댓글