[백준] 33934. 징검다리의 징검다리 (Java)

서재·2026년 1월 13일

백준 알고리즘 풀이

목록 보기
48/49

👨‍💻 문제


✍️ 풀이

하나의 호수 내의 돌은 항상 원하는 곳으로 갈 수 있기 때문에 돌의 개수 이외에는 고려할 필요가 없다.
징검다리 돌의 개수를 호수를 방문할 수 있는 횟수로 바꾸어 생각한다.

출발 지점에서 도착 지점까지의 최단 거리와 최장 거리를 계산하여 밟아야 하는 돌의 수가 그 사이에 있다면 건널 수 있다.

        if (maxDist >= limit && minDist <= limit) {
            System.out.println(1);
        } else {
            System.out.println(0);
        }

연산을 편하게 하기 위해 출발 지점과 도착 지점 중 작은 수를 출발 지점, 큰 수를 도착 지점으로 바꾼다.

        if (start > end) {
            int temp = start;
            start = end;
            end = temp;
        }

➡️ 최단 거리

단순히 출발 지점과 도착 지점까지의 거리를 구한다.

		int minDist = end - start + 1;

🔁 최장 거리

출발 지점에서 좌측으로 갈 수 있을만큼 가보고 출발 지점으로 돌아온다.
출발 지점에서 도착 지점까지 간다.
도착 지점에서 우측으로 갈 수 있을만큼 가보고 도착 지점으로 돌아온다.

이 때 좌우 끝의 호수에 도달했을 때 뿐만 아니라 방문할 수 있는 횟수가 1인 호수에 도달할 때에도 돌아간다.
(돌아갈 때 한 번 더 방문할 수 없기 때문에)

7 6 3
4 1 7 2 2 4 9
  ┌─🚩
  └──────────┐
         🏁─┘
        int maxDist = 0;
        int left = start;
        while (left > 0) {
            if (rock[left] == 1) {
                break;
            }
            left--;
        }
        int right = end;
        while (right < N - 1) {
            if (rock[right] == 1) {
                break;
            }
            right++;
        }
        for (int i=left; i<=right; i++) {
            maxDist += rock[i];
        }

📄 전체 소스코드

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

public class _33934 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int start = Integer.parseInt(st.nextToken()) - 1;
        int end = Integer.parseInt(st.nextToken()) - 1;

        if (start > end) {
            int temp = start;
            start = end;
            end = temp;
        }

        st = new StringTokenizer(br.readLine());
        int[] rock = new int[N];
        for (int i=0; i<N; i++) {
            rock[i] = Integer.parseInt(st.nextToken());
        }

        int limit = Integer.parseInt(br.readLine());

        int minDist = end - start + 1;

        int maxDist = 0;
        int left = start;
        while (left > 0) {
            if (rock[left] == 1) {
                break;
            }
            left--;
        }
        int right = end;
        while (right < N - 1) {
            if (rock[right] == 1) {
                break;
            }
            right++;
        }
        for (int i=left; i<=right; i++) {
            maxDist += rock[i];
        }

        if (maxDist >= limit && minDist <= limit) {
            System.out.println(1);
        } else {
            System.out.println(0);
        }
    }

}
profile
입니다.

0개의 댓글