반응형
이번 문제는 BFS 문제이다.
BFS문제는 현재 상태와 다음 상태에 대한 관계를 정의하는 것이 첫 번째라고 볼 수 있다.
이번 문제에서는 현재 상태와 다음 상태는 D S L R로 이루어지는 문자열의 길이로 판가름난다.
예를 들어 현재 상태가 L 이라면 다음으로 갈 수 있는 상태는 LD, LS, LL, LR 이렇게 네 가지이다.
즉 현재가 500이라면 다음 상태는 1000, 499, 5000, (00)50이 되는 것이다.
좀 더 프로그래밍적으로 접근해보자.
예를 들어 초기값이 1234이고 3412를 만든다고 해보자.
먼저 초기값 1234와 빈 문자열을 c++에서 지원하는 자료형인 pair로 묶어 큐에 넣어준다.
그 후 큐(queue)가 빌 때까지 아래와 같이 반복문을 돈다.
1. 의 첫번째 데이터를 가져오고 pop을 한다.
2. 가져온 상태에서 방분한 적이 없고 방문할 수 있는 경우들을 다시 큐에 넣어준다. 큐에 넣어줄 때는 다음 값과 문자열을 다시 pair로 묶어준다.
이 때 큐에 넣어준 값은 방문함을 나타내는 visited배열에서 해당 인덱스를 true로 만들어준다.
3. 원하는 답을 찾았을 때 break
큐에서 넣었던 데이터를 차례대로 꺼내오기 때문에 같은 depth별로 차례대로 검사하며 내려가게 되고 그렇기 때문에 최초 발견한 값이 최소값이 된다.
소스코드는 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | #include <iostream> #include <queue> #include <vector> using namespace std; int main() { int N; cin >> N; vector<pair<int, int>> Case(N); for(int i=0; i<N; i++){ cin >> Case[i].first >> Case[i].second; } for(int i=0; i<N; i++){ queue<pair<int, string>> q; vector<bool> visited(10000, 0); q.push(make_pair(Case[i].first, "")); visited[Case[i].first] = true; while(!q.empty()) { int now = q.front().first; string way = q.front().second; q.pop(); if(now == Case[i].second) { cout << way << endl; break; } else { int next = (now*2) % 10000; if(!visited[next]) { visited[next] = true; q.push(make_pair(next, way+"D")); } if(now == 0) {next = 9999;} else {next = now-1;} if(!visited[next]) { visited[next] = true; q.push(make_pair(next, way+"S")); } if(now != 0) { next = (now%1000)*10 + now/1000 ; if(!visited[next]) { visited[next] = true; q.push(make_pair(next, way+"L")); } next = (now/10) + (now%10)*1000; if(!visited[next]) { visited[next] = true; q.push(make_pair(next, way+"R")); } } } } } } // 해결 | cs |
지적 및 비판은 언제나 환영입니다. :)
반응형
'Algorithm > 문제 풀이' 카테고리의 다른 글
BOJ백준 3649 로봇프로젝트 풀이(C++) (0) | 2019.02.21 |
---|---|
BOJ 백준 6236 용돈관리 풀이(C++) (0) | 2019.02.11 |
BOJ백준 2293 동전1 풀이(Python) (0) | 2019.02.08 |
BOJ백준 1890 점프 풀이(Python) (0) | 2019.02.06 |
BOJ백준 1748 수 이어 쓰기1 풀이(C++) (0) | 2019.02.06 |