[프로그래머스] 징검다리 (이분탐색)

2025. 4. 28. 23:14·Algorithm

문제 소개

 

오늘 풀었던 프로그래머스 - 징검다리 문제를 정리합니다.

이 문제는 출발지점부터 도착지점까지 가는 경로 중,
바위를 n개 제거하여 "각 지점 사이의 거리의 최솟값"을 최대화하는 문제입니다.

문제 링크: 징검다리 - 프로그래머스

 


문제 접근 방식

이 문제는 다음과 같은 방식으로 접근했습니다:

  1. "거리의 최솟값"이 얼마나 될 수 있는지를 이분 탐색합니다.
  2. 특정 거리(mid)를 기준으로, 이 거리보다 짧은 구간이 생기지 않도록 하려면 몇 개의 바위를 제거해야 하는지 계산합니다.
  3. 제거해야 하는 바위 수가 n개 이하이면 거리를 늘리고, 초과하면 줄입니다.

해결 과정 및 코드

핵심 아이디어

  1. 거리의 최소 후보값을 mid로 잡고,
  2. rocks 배열을 순회하면서:
    • 현재 위치와 이전 위치 차이가 mid보다 작으면 바위를 제거
    • 그렇지 않으면 그 바위를 유지
  3. 총 제거한 바위 수를 보고 n과 비교하여 이분 탐색 방향을 결정합니다.
  4. 탐욕적(greedy) 방법과 결합된다
    rocks를 순회하면서, 거리 조건을 만족하지 못하는 바위는 즉시 제거한다.
  5. 마지막 도착지점까지의 거리를 따로 체크해야 한다. (중간에만 보는 것 ×)

코드

시간 복잡도 : O(log(distance) × rocks.length)

import java.util.*;

class Solution {
    public int solution(int distance, int[] rocks, int n) {
        Arrays.sort(rocks);
        int left = 1;
        int right = distance;
        int answer = 0;

        while (left <= right) {
            int mid = (left + right) / 2;
            int prev = 0;
            int removed = 0;

            for (int rock : rocks) {
                if (rock - prev < mid) {
                    removed++; // 거리가 짧으면 바위 제거
                } else {
                    prev = rock; // 거리 충분하면 바위 유지
                }
            }

            if (distance - prev < mid) removed++; // 마지막 도착점까지 거리 체크

            if (removed <= n) {
                answer = mid;
                left = mid + 1; // 거리를 늘려본다
            } else {
                right = mid - 1; // 거리를 줄인다
            }
        }

        return answer;
    }
}

'Algorithm' 카테고리의 다른 글

[프로그래머스] 네트워크 문제 (유니온 파인드 Disjoint Set)  (0) 2025.04.29
[프로그래머스] 단어 변환 (BFS)  (0) 2025.04.28
[프로그래머스] 입국 심사 (이분탐색)  (0) 2025.04.27
[프로그래머스] H-Index (정렬)  (0) 2025.04.27
[프로그래머스] 가장 큰 수 풀이 (정렬)  (0) 2025.04.26
'Algorithm' 카테고리의 다른 글
  • [프로그래머스] 네트워크 문제 (유니온 파인드 Disjoint Set)
  • [프로그래머스] 단어 변환 (BFS)
  • [프로그래머스] 입국 심사 (이분탐색)
  • [프로그래머스] H-Index (정렬)
Celion
Celion
오늘도 평소처럼 화이팅!
  • Celion
    Orion Log
    Celion
  • 전체
    오늘
    어제
    • 전체 글 (144)
      • Uncompiled Thoughts (8)
        • 네이버 부스트캠프 10기 (5)
      • CS 기초부터 한 걸음씩 (34)
      • Code Odyssey (22)
      • Algorithm (77)
        • Coding Test Records (63)
      • Git (3)
      • reference (0)
  • 블로그 메뉴

    • 태그
    • 방명록
  • 태그

    java
    알고리즘고득점kit
    Kotlin
    프로그래머스
    boostcamp
    문법정리
    greedy
    코테
    시뮬레이션
    Level2
    Level3
    백준
  • 최근 글

  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
Celion
[프로그래머스] 징검다리 (이분탐색)
상단으로

티스토리툴바