※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 14713번 문제인 앵무새이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/14713 

 

14713번: 앵무새

자가용 비행기를 타고 세계 일주를 하던 pps789와 cseteram은 어느 날 엔진 고장으로 인해 이름 모를 섬에 불시착하게 된다. 그들은 이 섬을 탐험하는 도중 아주 신기한 사실을 알게 되었는데, 바로

www.acmicpc.net

모든 단어는 모두 많아야 한번 등장한다는 조건을 눈여겨보자.

 

위 조건을 이용하면 전체 단어열에서 각 문장을 구성하는 단어들을 순서대로 찾아보는 것으로 문제를 해결할 수 있다는 점을 관찰할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
#include <vector>
using namespace std;

vector<string> sentences[100];
vector<string> heard;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	string s; getline(cin, s);
	int N = stoi(s);

	int wordcnt = 0;

	for (int i = 0; i < N; i++) {
		getline(cin, s);
		s += " ";
		int slen = s.length();
		int substridx = 0;
		int substrlen = 0;
		for (int k = 0; k < slen; k++) {
			if (s[k] == ' ') {
				sentences[i].push_back(s.substr(substridx, substrlen));
				substridx = k + 1;
				substrlen = 0;
			}
			else {
				substrlen++;
			}
		}

		wordcnt += sentences[i].size();
	}

	getline(cin, s);
	s += " ";
	int slen = s.length();
	int substridx = 0;
	int substrlen = 0;
	for (int k = 0; k < slen; k++) {
		if (s[k] == ' ') {
			heard.push_back(s.substr(substridx, substrlen));
			substridx = k + 1;
			substrlen = 0;
		}
		else {
			substrlen++;
		}
	}

	bool chk = 1;
	if (wordcnt != heard.size()) chk = 0;

	for (int i = 0; i < N; i++) {
		auto idx = sentences[i].begin();
		auto iter_end = sentences[i].end();
		for (auto word : heard) {
			if (word == *idx) idx++;
			if (idx == iter_end) break;
		}
		if (idx != iter_end) chk = 0;
	}

	if (chk) cout << "Possible";
	else cout << "Impossible";
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 24955 // C++] 숫자 이어 붙이기  (0) 2022.07.12
[BOJ 4011 // C++] 기름 파기  (0) 2022.07.11
[BOJ 25024 // C++] 시간과 날짜  (0) 2022.07.10
[BOJ 4328 // C++] 기초 나머지 계산  (0) 2022.07.10
[BOJ 15240 // C++] Paint bucket  (0) 2022.07.10

+ Recent posts