문제 정보
- 문제: https://www.acmicpc.net/problem/7577
- 요약: 길이 K인 직선 도로에 물체가 묻혀 있습니다. N개의 탐사 결과 Probe[x,y]=r (구간 [x,y]에 물체가 r개)가 주어질 때, 모든 조건을 만족하는 물체 배치를 찾거나, 불가능하면 “NONE"을 출력합니다.
- 제한: 시간 1초, 메모리 128MB, 3 <= K <= 40, 2 <= N <= 1,000, 1 <= x <= y <= K, 0 <= r <= 1,000
입출력 형식/예제
| |
| |
예제 설명:
- 예제 1: 위치 3, 6, 7, 8, 9, 12에 물체가 있는 배치가 모든 조건을 만족
- 예제 2: [4,7]에 3개 필요하지만 [1,10]에 1개만 있을 수 있으므로 모순 (4
7은 110의 부분집합)
접근 개요
핵심 관찰
- 누적합으로 모델링: S[i] = 위치 1부터 i까지 물체의 개수 (S[0] = 0)
- 제약 조건 변환:
- Probe[x,y] = r => S[y] - S[x-1] = r
- 각 위치에는 물체가 0개 또는 1개 => S[i] - S[i-1] in {0, 1}
- 차분 제약 시스템: 등식을 두 부등식으로 분리하여 그래프 최단경로 문제로 변환
- 음수 사이클: 해가 존재하지 않으면 그래프에 음수 사이클이 존재
알고리즘 흐름
| |
알고리즘 설계
차분 제약 조건 (Difference Constraints)
차분 제약 시스템은 다음 형태의 부등식 집합입니다:
- x_j - x_i <= c_ij
이를 그래프로 모델링합니다:
- 노드: 각 변수 x_i
- 간선: i -> j, 가중치 c_ij (x_j - x_i <= c_ij 조건에서)
정리: 차분 제약 시스템의 해가 존재하는 필요충분조건은 대응하는 그래프에 음수 사이클이 없는 것입니다.
SPFA (Shortest Path Faster Algorithm)
Bellman-Ford의 최적화 버전으로, 큐를 사용하여 필요한 노드만 완화합니다:
- 각 노드가 큐에 n번 이상 들어가면 음수 사이클 존재
- 평균 시간복잡도: O(E), 최악: O(VE)
결과 구성
SPFA 완료 후 dist[i] - dist[i-1]이 1이면 해당 위치에 물체가 있고, 0이면 없습니다.
복잡도
- 시간: O(N * K) - N개 제약 조건, K개 노드에서 SPFA
- 공간: O(K + N) - 인접 리스트와 거리 배열
구현
| |
코너 케이스 체크리스트
- 상호 모순 조건: [x1,y1]과 [x2,y2]가 포함관계인데 개수가 맞지 않는 경우 -> NONE
- 단일 위치 조건: Probe[i,i]=0 또는 Probe[i,i]=1 -> 해당 위치 확정
- 전체 범위 조건: Probe[1,K]=r -> 전체 물체 개수 결정
- 빈 결과: 모든 조건에서 r=0 -> 모두 ‘-’
- 최대 입력: K=40, N=1000 -> 시간 내 충분히 처리 가능
제출 전 점검
- 입력 형식: K, N 먼저 읽고 N개의 x y r 읽기
- 출력 형식: 길이 K인 문자열 또는 “NONE”
- 오버플로우: 거리 계산에 long long 사용
- 음수 사이클 탐지: 방문 횟수 > n 조건
- 인덱싱: 문제는 1-indexed, 코드는 0-indexed S[0] 사용
참고자료/유사문제
- 백준 1219 - 오민식의 고민 - Bellman-Ford 음수 사이클
- 백준 11657 - 타임머신 - Bellman-Ford 기본
- Difference Constraints 개념
- CLRS Chapter 24.4 - Difference Constraints and Shortest Paths
코너 케이스 및 실수 포인트
| 케이스 | 설명 | 처리 방법 |
|---|---|---|
| 최소 입력 | N=1 또는 빈 입력 | 반복문 범위·예외 처리 확인 |
| 오버플로우 | 답이 $2^{31}$ 초과 가능 | long long (C++) 등 사용 |
![Featured image of post [Algorithm] C++ 백준 7577번: 탐사](/post/algorithm/2025-12-02-boj-7577-exploration-difference-constraints-spfa-cpp-solution/wordcloud_hu_587ee3c5e9a38c7c.webp)
![[Algorithm] C++ 백준 2626번: 헬기착륙장](/post/algorithm/2025-12-02-boj-2626-helicopter-landing-site-minenc-cpp-solution/wordcloud_hu_300eea2731f29696.webp)
![[Algorithm] C++ 백준 4354번: 문자열 제곱](/post/algorithm/2025-12-02-boj-4354-string-power-period-kmp-cpp-solution/wordcloud_hu_90e5385b7ea76c6a.webp)
![[Algorithm] C++ 백준 7577번: 탐사](/post/algorithm/2025-12-02-boj-7577-exploration-difference-constraints-spfa-cpp-solution/wordcloud_hu_77e00c99bfe3b1d9.webp)
![[Algorithm] C++ 백준 8096번 모노크로매틱 삼각형](/post/algorithm/2025-12-02-boj-8096-monochromatic-triangles-graph-cpp-solution/wordcloud_hu_8a868ca4d07497c8.webp)
![[Algorithm] C++ 백준 1031번: 스타 대결](/post/algorithm/2025-10-14-boj-1031-star-battle-cpp-solution/wordcloud_hu_486b538da11f5f71.webp)
![[Algorithm] C++ 백준 17481번: 최애 정하기](/post/algorithm/2026-02-06-boj-17481-favorite-member-bipartite-matching-hopcroft-karp-cpp-solution/wordcloud_hu_44b3c5d534a357d8.webp)
![[Algorithm] C++ 백준 13232번: Domain clusters](/post/algorithm/2025-12-22-boj-13232-domain-clusters-scc-tarjan-cpp-solution/wordcloud_hu_a1e9324420b23710.webp)
![[Algorithm] C++ 백준 11405번: 책 구매하기 - 최소 비용 최대 유량](/post/algorithm/2025-08-14-boj-11405-book-purchasing-min-cost-max-flow-cpp-solution/wordcloud_hu_e3d0a4ca3d57e9c9.webp)
![[Algorithm] C++/Python 백준 3640번: 제독 - 최소 비용 최대 유량](/post/algorithm/2025-08-14-boj-3640-admiral-min-cost-max-flow-cpp-python-solution/wordcloud_hu_2c5aad769eac241.webp)
![[Algorithm] C++ 백준 25172번: 꼼꼼한 쿠기의 졸업여행](/post/algorithm/2026-01-24-boj-25172-graduation-trip-dynamic-connectivity-dsu-offline-cpp-solution/wordcloud_hu_6a5672d9d17b4add.webp)