백준/구현

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

배발자 2022. 1. 13.
반응형

 

 

<find> 문자열 안에 문자/문자열 찾기

find 코딩테스트에서 정말 많이 쓰이는 함수이다. 어떠한 문자 또는 문자열을 찾기 위해서 for문을 돌려가며 체크를 무식하게 해왔던 기억이 있다. 그렇게 하지말고 find 함수를 사용하여 쉽게 check

baebalja.tistory.com

 

<substr> 인덱스로 문자열 자르기

문자열을 처리하기 위해서 정말 많이 쓰이는 함수이다. 이 함수는 어떠한 문자열의 특정 인덱스에서 어떠한 인덱스까지 사이의 새로운 문자열을 만들때 보통 사용된다. 예를 들어, "abcdefe" 라는

baebalja.tistory.com


해당 문제를 풀기 위해서 find() 함수와 substr() 함수를 알아야한다. 

해당 함수를 사용할 줄 모른다면 메뉴에서 "C++ 코테 문법 문자열" 카테고리에서 참고해야 한다.

 

 먼저 '*'이 하나만 존재 하기 때문에 해당 문자의 인덱스를 저장을 하여 

그 문자를 기준으로 왼쪽 파티션과 오른쪽 파티션으로 구분을 한다. 즉, 각 파티션의 문자열을 생성해주면 된다. 

 

cmp라는 문자열에 입력값을 받고 해당 문자열을 가지고 아까 나누었던 파티션 왼쪽, 오른쪽을 비교 한다. 

 

제일 중요한 것은 새로 입력받은 cmp의 사이즈가 "파티션왼쪽+ 파티션오른쪽"의 사이즈 보다 무조건 이상이여야한다. 

 

그렇지 않다면 조건 자체가 성립이 안된다. 그렇기 때문에 이러한 점을 먼저 체크해주고, 

 

두번째는 파티션 왼쪽 문자열이 cmp 문자열을 바로 찾는다면 첫번째 조건이 통과된다. 두번째 조건은 파티션 오른쪽 문자열의 크기만큼 cmp 문자열을 끝에서 자르고 자른 문자열과 파티션 오른쪽의 문자열이 같다면 "DA"를 출력하면 된다. 이 조건이 성립하지않는다면 "NE"를 출력하면 된다. 

 

코드 주석에 자세히 설명하였으니 참고

#include <iostream>
#include <string>
using namespace std; 
int main() {
	int n; cin >> n; 
	string s; cin >> s; 
	int index = s.find('*');//별을 기준으로 파트 나누기, 인덱스 번호 받아오기
	string part1 = s.substr(0, index); //왼쪽 파트 부분 
	string part2 = s.substr(index + 1); //오른쪽 파트 부분
	while (n--) { //n번 동안
		string cmp=""; 
		cin >> cmp; //string 하나 생성
		if (part1.size() + part2.size() > cmp.size())cout << "NE\n";//part1,2 의 사이즈를 합했을때 cmp문자열 보다 크면 NE 출력
		else if (cmp.find(part1) == 0) { //만약 part1 문자열이 cmp문자열안에 있고 첫부분이라면. 
			string ex = cmp.substr(cmp.size() - (part2.size())); // 문자열 ex 에 part2의 사이즈만큼 끝부분을 잘라서 저장
			if (ex == part2)cout << "DA\n"; //자른 문자열이 part2와 동일하냐? 그렇다면 DA출력
			else cout << "NE\n"; //아니라면 NE 출력
		}
		else cout << "NE\n";// part1과 cmp문자열이 일치하지 않으면 NE 바로 출력
	}
}
 

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

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

www.acmicpc.net

 

반응형

댓글