알고리즘/백준-실버

백준 9996번 한국이 그리울 땐 서버에 접속하지 (C++)

뜨거운 개발자 2022. 12. 30. 23:14

문제

정답 코드

#include <iostream>
#include <string>

using namespace std;
char result[101];
int main()
{
	ios :: sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin >> n;
	string input;
	cin >>input;
	string head;
	string tail;
	for (int i=0; i < input.size(); i++)
	{
		if (input[i] == '*')
		{
			head = input.substr(0, i);
			tail = input.substr(i+1, input.size());
			break;
		}
	}
	string cmp;
	int i;
	for (i=0; i < n; i++)
	{
		cin >> cmp;
		if (cmp.size() < head.size() + tail.size())
		{
			result[i] = 2;
		}
		else
		{
			if (cmp.substr(0,head.size()) == head && cmp.substr(cmp.size() - tail.size(), tail.size()) == tail)
				result[i] = 1;
			else
				result[i] = 2;
		}
	}
	for (int j =0; j < i; j++)
	{
		if (result[j] == 1)
			cout << "DA\n";
		else if (result[j] == 2)
			cout << "NE\n";
	}

}

문제 풀이의 흐름

  1. 일단 앞쪽에 있는 문자열을 *이 나오기 전까지 잘라서 가지고 있고
  1. 뒤쪽에 있는 문자열을 *이 나온 이후 뒤에 있는 걸로 자른다.
  1. 혹시나 길이가 head와 tail의 길이의 합보다 큰 경우에는 절대 같은 값이 될 수 없음을 인지하고 그 부분은 실패했다는 의미로 flag를 2로 해서 아니라고 표시를 한다.
  1. 그 외의 경우에는 이제 substr을 사용해서 head와 tail이 같아야만 패턴이 일치하는 것으로 구분하였다.

주의 할 점

  1. a*d 인 입력에서 a만 들어올 때 DA가 출력되는게 아니라 NE가 출력되어야만 한다.
  1. a*d 말고도 abc*ABC 이런식으로 들어올 수 있음을 알아야한다.

반성 및 고찰

실패 코드

#include <iostream>
#include <string>

using namespace std;
char result[101];
int main()
{
	ios :: sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin >> n;
	string input;
	cin >>input;
	char a =input[0];
	char b = input[2];
	// cout << b;
	string cmp;
	int i;
	for ( i=0; i < n;i++)
	{
		cin >> cmp;
		// cout << *(cmp.end());
		if (cmp.size() > 1 && cmp[0] == a && *(cmp.end() - 1) == b)
			result[i] = 1;
			// cout << "DA\n";
		else
			result[i] = 2;
			// cout << "NE\n";

	}
	for (int j =0; j < i; j++)
	{
		if (result[j] == 1)
			cout << "DA\n";
		else if (result[j] == 2)
			cout << "NE\n";
	}
}

실패원인

  1. 문제를 잘 못 읽었다. 예시에 문자 1개 *1개 문자1개 이런식으로 되어있어서 파싱을 아에 그렇게 해줬는데 문자는 여러가지가 올 수가 있었다.
  1. a*d 말고도 abc*ABC 이런식으로 들어올 수 있음을 알아야한다.

그 외의 고찰

string에서 end()를 보면 마지막 이터레이터를 보는데 실패 코드에서 *(cmp.end())로 비교를 할 때 간간히 성공을 했다. 아마 컴파일러가 알아서 최적화를 해준 것 같은데 이 부분은 앞으로 주의해서 사용을 해야 할 것 같고 끝 부분을 볼때는 반드시 str1.back(); 이런식으로 사용해줄 것을 권장하는 것 같다.

end()-1 로 접근해서 봐도 문제는 없는 것 같다 다만 더 간단한 back이 있으니까 back 메서드를 써주도록 하자


Uploaded by N2T

728x90