해당 문제는 백준 사이트에서 풀 수 있습니다.
https://www.acmicpc.net/problem/13549
1. 문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다.
수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다.
순간이동을 하는 경우에는 0초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
예제 입력 1
5 17
예제 출력 1
2
힌트
수빈이가 5-10-9-18-17 순으로 가면 2초만에 동생을 찾을 수 있다.
2. 조건
3. 풀이
이 문제 역시 숨바꼭질1, 숨바꼭질2와 비슷한 문제입니다.
단, 순간이동시 0초가 걸리는게 문제입니다.
여기서 우리는 각 비용별로 최소 비용이 들면서 가장 빠른 경로를 찾아야 합니다.
가장 빠른 경로를 찾을 땐 bfs를 이용하면 됩니다.
문제는 최소 비용입니다. 순간이동시 0초가 걸리니 말이죠.
그래서 저는 int isCost[] 라는 배열을 선언한 뒤,
해당 위치에 cost비용이, 지금 계산된 cost비용보다 크다면 교체하는 식으로 구했습니다.
그리고 bfs를 통해 수빈이의 위치에 도착한 요소가 발생되면,
이미 queue안에는 최소로 갈 수 있는 여러 경로가 저장되어 있다는 뜻입니다.
따라서 queue안에 넣어둘 때마다 isCost[] 값을 최소 값으로 변경해 준다면, 쉽게 구할 수 있습니다.
코드를 보고 이해하시기 바랍니다.
4. 코드
'코딩테스트 > 백준' 카테고리의 다른 글
백준 13913] C++ 벽 부수고 이동하기 (0) | 2020.11.09 |
---|---|
백준 13913] C++ 숨바꼭질4 (0) | 2020.11.08 |
백준 12851] C++ 숨바꼭질2 (0) | 2020.11.06 |
백준 1697] C++ 숨바꼭질 (0) | 2020.11.05 |
백준 14719] C++ 빗물 (0) | 2020.11.04 |
댓글