Dolphins의 HelloWorld

[백준]Baekjoon1697(DFS,BFS,백트래킹,Dynamic Programming) 본문

Algorithm/baekjoon문제풀이

[백준]Baekjoon1697(DFS,BFS,백트래킹,Dynamic Programming)

돌핀's 2018. 9. 17. 20:06

문제링크 : https://www.acmicpc.net/problem/1697




풀이



문제 분류가 DFS, BFS로 되어있고 실제로 정답을 맞춘 사람들의 풀이를 보면 큐를 이용해서


푼 사람들이 대부분이지만 난 그냥 Dynamic Programming 으로 풀었다.



Dynamic Programming으로 푼다고하면 아마 초기값 설정에서 애매하게 느낄 수 있겠지만


난 그냥 수빈이 위치 이전값들은 걸어서 이동하는 것 밖에 방법이 없으므로 


수빈이 위치를 0으로 놓은 상태에서 1씩 증가시키면서


일일히 다 넣어주었다.



그런다음 수빈이 위치 + 1 부터 동생의 위치 + 1까지 for문을 통해 반복문을 진행하면서


만약 인덱스 i가 짝수라면 다음과 같이


arr[i] = min(arr[i / 2] + 1, arr[i - 1] + 1); 


수빈이가 i/2에서 순간이동 할 수 있으므로 그 때 걸린 시간과 , 걸었을 떄 걸린시간을 비교해서 


배열에 넣어주었고 



만약 동생의 위치가 17일 때 16에서 17로 걸어서 이동한것보다 9에서 18로 순간이동 후 걸어서


이동한게 더 시간이 적게 걸릴 수 있으므로 이를 반영하여


if (i != 0) arr[i - 1] = min(arr[i - 1], arr[i] + 1);


이렇게 다시 또 조건문을 수행할 수 있도록 하였다.


코드는 다음과 같다.


#include <iostream>
#include <algorithm>

using namespace std;

int arr[100001];
int main()
{
	int N, K;
	scanf("%d %d", &N, &K);
	arr[N] = 0;
	int num = 1;
	for (int i = N - 1; i >= 0; i--) arr[i] = num++;

	if (K > N) {
		for (int i = N + 1; i <= K+1; i++) {
			if (i % 2 == 0) {
				arr[i] = min(arr[i / 2] + 1, arr[i - 1] + 1);
			}
			else
				arr[i] = arr[i - 1] + 1;
			if (i != 0) arr[i - 1] = min(arr[i - 1], arr[i] + 1);
		}
	}
	printf("%d\n", arr[K]);
}



이와 별도로 BFS를 통해 푼 풀이를 같이 첨부하면서 풀이를 마치겠다.


#include <iostream>
#include <queue>

using namespace std;

bool check[100001];

int main()
{
	int N, K;
	scanf("%d %d", &N, &K);
	int time = 0;
	queue<pair<int, int>> q;
	q.push(make_pair(N, time));
	int index;

	while (1)
	{
		index = q.front().first;
		time = q.front().second;
		q.pop();

		check[index] = true;
		if (index == K) {
			printf("%d\n", time);
			break;
		}
		time++;

		int nx[3] = { index + 1,index - 1,index * 2 };
		for (int i = 0; i < 3; i++) {
			if (nx[i] > 100000 || nx[i] < 0) continue;
			if (check[nx[i]]) continue;
			q.push(make_pair(nx[i], time));
		}
	}

}

'Algorithm > baekjoon문제풀이' 카테고리의 다른 글

[백준]Baekjoon9019(BFS,큐)  (0) 2018.09.21
[백준]Baekjoon1963(BFS,큐)  (0) 2018.09.19
[백준]Baekjoon6603[순열]  (0) 2018.09.16
[백준]Baekjoon10971(순열)  (0) 2018.09.15
[백준]Baekjoon10819(순열)  (0) 2018.09.15
Comments