console.log

[BOJ] 13549 숨바꼭질 3 JAVA 본문

알고리즘/백준

[BOJ] 13549 숨바꼭질 3 JAVA

foresight 2023. 10. 26. 18:06

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

 

13549번: 숨바꼭질 3

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때

www.acmicpc.net

 

메모리 : 11,968kb
실행시간 : 84ms

 

문제분석

DP

bfs로 풀면 시간초과 ... 그렇다면 DP
2배로 건너뛰는 건 0초니까 짝수, 홀수일 때를 나눠서 메모

 

걸린시간

1시간 ⏱️

 

풀이방법

- K가 N보다 작은 경우는 그 값의 차이만큼 출력

- K가 N보다 큰 경우
* 우선 순위 : 2배로 건너뛰기 > 1칸 앞 = 1칸 뒤 *
1. 0부터 N까지는 N까지의 거리만큼 채워놓기
2. N + 1 부터 DP
- 짝수일 경우 : (-1칸의 값 + 1)과 (i / 2 칸)의 값을 비교해서 더 작은 값을 저장
- 홀수의 경우 : (-1칸의 값 + 1)과 ((i + 1) / 2 칸의 값 + 1)과 ((i - 1) / 2 칸의 값 + 1)의 값을 비교해서 더 작은 값을 저장
3. K번째에 저장된 값 출력

 

포인트

시간복잡도를 고려해 최적화된 알고리즘을 선택해야 한다 !!!

 

코드

package study.day1013;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ_13549_숨바꼭질3 {	// 메모리 : 11,968 kb		실행시간 : 84 ms
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int N = Integer.parseInt(st.nextToken());
		int K = Integer.parseInt(st.nextToken());

		if(K < N) {
			System.out.println(N - K);
			return;
		}

		int[] dp = new int[K + 1];

		for (int i = N - 1; i >= 0; i--) {
			dp[i] = dp[i + 1] + 1;
		}

		for (int i = N + 1; i <= K; i++) {
			dp[i] = dp[i - 1] + 1;
			if(i % 2 == 0) {
				dp[i] = Math.min(dp[i], dp[i / 2]);
			}
			if(i % 2 != 0) {
				dp[i] = Math.min(Math.min(dp[i], dp[(i - 1) / 2] + 1), dp[(i + 1) / 2] + 1);
			}
		}
		System.out.println(dp[K]);
	}
}

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ] 1806 부분합 JAVA  (1) 2023.11.04
[BOJ] 4485 녹색 옷 입은 애가 젤다지? JAVA  (1) 2023.10.29
[BOJ] 1238 파티 JAVA  (0) 2023.10.24
[BOJ] 1342 행운의 문자열 JAVA  (1) 2023.10.04
[BOJ] 17281 ⚾ JAVA  (0) 2023.10.03