Koder / 박성훈
article thumbnail

실버골드 랜덤디펜스

BFS를 사용해서 풀어보았다.

 

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

 

12919번: A와 B 2

수빈이는 A와 B로만 이루어진 영어 단어 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수빈

www.acmicpc.net

 

처음에는 S에서 시작해서 T로 문자열을 하나씩 붙여가면서 완탐을 돌릴 생각을 했는데,

S.length() 가 1이고 T.length()가 50인경우에는 메모리초과가 발생하게 된다.

 

그래서 미리미리 불가능해보이는 경우의 수는 쳐낼생각을 해야 하는데,

생각을 정 반대로 바꿔서

 

T에서 시작해서 S로 문자열을 하나씩 잘라가면서 완탐을 해주면 된다.

이 경우에는

1. 문자열의 제일 끝자리가 A이거나

2. 문자열의 제일 앞자리가 B이여야만 한다.

라는 제약조건이 생기기 때문에

완전탐색을 해도 시간초과나 메모리초과를 받지 않고 문제를 해결할 수 있다.

 

#include <bits/stdc++.h>
using namespace std;

unordered_map<string,int> m;
queue<string> q;

string st,ed;
int N;

void bfs(string s){
	string now, nxt;
	int len;
	
	q.push(s);
	m[s] = 1;
	
	while(!q.empty()){
		now = q.front(); q.pop();
		len = now.length();
		
		if(now[0] == 'B'){
			nxt = now.substr(1);
			reverse(nxt.begin(), nxt.end());
			
			if(m[nxt] == 0 && nxt.length() >= N){
				q.push(nxt);
				m[nxt] = 1;
			}
		}
		
		if(now[len-1] == 'A'){
			nxt = now.substr(0,len-1);
			
			if(m[nxt] == 0 && nxt.length() >= N){
				q.push(nxt);
				m[nxt] = 1;
			}
		}
	}
	return;
}

int main(){
	cin >> st >> ed;
	N = st.length();
	
	bfs(ed);
	
	cout << m[st];
	
	return 0;
}

 

반응형