https://www.acmicpc.net/problem/2212
문제 분석
- 도로 위 N개의 센서를 설치
- 센서들이 수집한 자료들을 모으고 분석할 몇 개의 집중국을 세우려고 하는데 K의 집중국을 세울 수 있다.
- 각 집중국은 센서의 수신 가능 영역을 조절할 수 있다.
- 집중국의 수신 가능 영역 : 고속도로 상에서 연결된 구간으로 나타나게 된다.
- N개의 센서가 적어도 하나의 집중국과는 통신이 가능해야 하며
- 집중국의 수신 가능 영역의 길이의 합을 최소화
- 직선의 고속도로
- 센서들은 직선 위의 한 기점인 원점으로부터 정수 거리의 위치에 놓여 있다.
- 각 센서의 좌표는 정수 하나로 표현
- 각 좌표 사이에 빈 칸 하나?
풀이
- 어떻게 집중국의 수신 가능 영역의 길이의 합을 최소화할 수 있을까?
- 가까운 센서들끼리 묶어서 집중국이 관리를 해야 수신 가능영역의 거리의 합의 최솟값이 된다.
- k개에 대해 최대한 포함하도록 집중국을 세워야 한다.
- 특정 위치에 집중국 k개를 두었을 때 수신 가능 영역들의 합
- 각 경우에 대한 최적해 → 그리디
- 각 센서마다의 간격을 구하고, 그 중 가장 긴 거리를 기준으로 k등분
코드 설계
- 입력받은 센서에 대해 정렬
- 각 센서에 대해 간격 구하기
- k개로 나누기 위해 k-1개 만큼의 거리가 큰 센서 위치 찾기
- 해당 위치들은 끊어지고 / 각 위치들에 대해 - 가장 작은 거리의 위치 찾기
정답 코드
실패..
import sys
input = sys.stdin.readline
n = int(input())
k = int(input())
sensor = list(map(int, input().split()))
sensors = sorted(sensor)
r_dic = {} # 각 센서마다의 간격 (도착 센서 index : 거리)
r_list = []
for i in range(1, n) :
r_dic[i] = abs(sensors[i] - sensors[i-1])
r_list[i].append(abs(sensors[i] - sensors[i-1]))
# k-1개만큼 간격이 큰 센서의 위치 찾기
location = []
for i in range(k-1) :
max_distance = max(r_list)
max_idx = r_list.index(max_distance)
location.append(max_idx) # 두 센서 중 나중 센서의 위치 반환 (i-1, i)
print(location)
# dis_k = []
# for j in range(n) :
다른 정답 코드 1
import sys
input = sys.stdin.readline
n = int(input())
k = int(input())
sensor = list(map(int, input().split()))
sensor = sorted(sensor)
x = []
for i in range(n-1) :
x += [sensor[i+1] - sensor[i]] # 센서간의 차이
x.sort()
print(sum(x[:n-k])) # 가장 긴 것 k-1개를 제외한 합
2회차 - 25.04.02
1차 - 틀림
import sys
input = sys.stdin.readline
n = int(input())
k = int(input())
sensor = list(map(int, input().split()))
sensor.sort()
dis = []
for i in range(1, n) :
dis.append(sensor[i] - sensor[i-1])
dis.sort()
print(sum(dis[:k]))
2차 - 맞음
import sys
input = sys.stdin.readline
n = int(input())
k = int(input())
sensor = list(map(int, input().split()))
sensor.sort()
dis = []
for i in range(1, n) :
distance = sensor[i] - sensor[i-1]
if distance == 0 :
continue
dis.append(distance)
dis.sort(reverse=True)
print(sum(dis[k-1:]))
왜 k-1 인가
k = 2
가장 거리가 먼 영역을 분해해 2개의 영역으로 나눔
나눠진 두 영역를 커버(수신가능)하기 위한 길이들의 합
k = 5
4개의 큰 영역을 쪼개면 5개의 영역이 됨
따라서 가장 거리가 긴 영역 4개가 사라짐 (k-1)
'코딩 테스트 > 백준' 카테고리의 다른 글
[Python] 백준 9095 1,2,3 더하기 (0) | 2025.04.02 |
---|---|
[Python] 백준 2217 로프 (0) | 2025.04.01 |
[Python] 백준 1697 숨바꼭질 (0) | 2025.03.24 |
[Python] 백준 13975 파일 합치기 3 (0) | 2025.03.20 |
[Python] 백준 2156 포도주 시식 (0) | 2025.03.19 |