-
백준_2212_센서 (python)Algorithm/백준_생각정리 2023. 8. 1. 11:12
★ 접근
센서의 개수 최대 만 + 집중국의 개수 최대 천 + 센서 좌표값 (절댓값) 백 만 + 시간 제한 2초 => 종합적으로 미뤄봤을 때 그리디 알고리즘이 떠올랐다. 근데 도대체 이것을 어떻게 그리디로 풀 것인가? 오랜 시간 생각해서 떠오른 것은 일단 데이터를 정렬하고 index가 1차이 나는 센서끼리 차이를 구해보기로 햇다.
★ 풀이
집중국을 하나 설치한다는 것은 모든 센서가 하나의 집중국과 수신한다는 얘기이다. 즉 모든 센서가 하나의 구성이다.
집중국을 두개 설치한다는 것은 센서가 두 개로 나뉘어져서 집중국과 수신한다는 얘기이다. 즉 센서가 두 구성이다.
예제 입력 1번을 예시로 들어보면 센서간의 차이가 1,2,2,3이 있다. 여기서 집중국을 두개 설치하는데 둘의 차이가 가장 적은 1을 빼면 센서는 (1 3 6) (7 9)로 나뉘어질 것이다. 여기서 첫 번째 집중국의 거리는 5가 되고 두 번째 집중국의 거리는 2가 된다. 그럼 도합 합은 7이다. 틀렸다.
틀린 예제에서 알 수 있듯이 거리차이가 가장 큰 센서 차이를 빼야 답이 가장 적어진다. 이유는 만약 가장 거리차이가 큰 3즉 (센서 3과 6사이를 갈랐다면) (1 3) (6 7 9)로 묶인다. 집중국의 수신거리 최소 합은 5가 된다.
[위에 풀이가 이해 안되신 분들을 위한 마지막 설명 ㅠㅠ 여기서는 이해 되시길 바랍니다... ]
(1 3 6 7 9) 한 묶음으로 존재하던 센서들이 있고 집중국 2개를 설치할 것인데 어느 부분에 갈라야 최소가 되는가? 거리차이가 가장 큰 부분 즉 3과 6 사이 (1 3) (6 7 9)이다. 즉 집중국 - 1만큼 갈라야 하고 그 개수만큼 거리차이가 큰 것 부터 없애고 남은 거리 차이를 더하면 된다.
★ 코드
import sys input = sys.stdin.readline n = int(input()) k = int(input()) data = list(map(int,input().split())) data = list(set(data)) data.sort() answer = [] for i in range(len(data) - 1): answer.append(data[i+1] - data[i]) answer.sort() if k >= len(data): print(0) else: for i in range(k-1): answer.pop() print(sum(answer))
★ 회고
접근을 쓰다 만 것에서 알 수 있듯이 감각적으로 차이까지만 구하고 풀지 못했다. 문제를 잘못 이해했다. 집중국을 어느 한 좌표에 설치하고 센서들과의 차이의 합을 구하는 것인줄 알았다. 집중국의 영역을 구하는 것이었다니....
화이팅!!!
'Algorithm > 백준_생각정리' 카테고리의 다른 글
백준_21758_꿀 따기 (python) (맛도리) (0) 2023.09.18 백준_29767_점수를 최대로 (python) (1) 2023.09.10 백준_15591_MooTube (python) (0) 2023.07.31 백준_16918_봄버맨 (python) (0) 2023.07.30 백준_28360_양동이 게임(python) (0) 2023.07.25