알고리즘/문제풀이

[백준 32068번] 보물 찾기

Ohnim · 오님 2024. 7. 18. 02:15

문제 링크

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

 

문제 요약

이 문제는 시작점 \(S\)에서 출발하여 보물 위치 \(L\) 또는 \(R\)에 방문하는데 필요한 이동 횟수를 계산하는 것이다. 이동 패턴은 한 단계식 오른쪽과 왼쪽을 번갈아가며 한 칸씩 점점 더 멀리 이동하는 방식이다.

 

문제 풀이

서브태스크 4번까지는 입력 제한이 크지 않아 시뮬레이션으로도 해결할 수 있다. 그러나 서브태스크 5번을 해결하려면 더 효율적인 접근 방법이 필요하다.

 

먼저, \(S\)보다 왼쪽에 있는 \(L\)을 방문하기 위해서는 \(S\)와 \(L\)의 거리만큼 떨어진 오른쪽에 있는 점들을 모두 방문해야 한다. 따라서 \(L\)을 방문하기 위한 이동 횟수는 \(2 \times (S - L)\)이다.

 

마찬가지로, \(S\)보다 오른쪽에 있는 \(R\)을 방문하기 위해서는 \(S\)와 \(R\)의 거리보다 1만큼 작은 거리에 떨어진 왼쪽의 모든 점들을 방문해야 한다. 따라서 \(R\)을 방문하기 위한 이동 횟수는 \(2 \times (R - S - 1)\)이다.

 

이 놀이는 \(L\)또는 \(R\)을 방문하면 끝난다. 따라서 두 값 중 작은 값이 정답이 된다. 아무것도 하지 않은 초기 상태도 이동 횟수에 포함되므로 최종적으로 1을 더해 출력해야 한다.

 

소스 코드

더보기
더보기
#include <stdio.h>

int t;

int main() {
    freopen("input.txt", "r", stdin);
    scanf("%d", &t);
    
    while (t--) {
        int l, r, s;
        scanf("%d%d%d", &l, &r, &s);
        
        int left = (s - l) * 2;
        int right = (r - s - 1) * 2 + 1;
        int ans = left < right ? left : right;
        
        printf("%d\n", ans + 1);
    }
}