[20250826] BOJ / G1 / 난민 / 한종욱 #744
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
🧷 문제 링크
https://www.acmicpc.net/problem/23090
🧭 풀이 시간
210분
👀 체감 난이도
✏️ 문제 설명
설명 적기 힘들다. 문제 읽자.
🔍 풀이 방법
이 문제는 두 가지 과정을 거쳐야 한다.
처음엔 y값의 값들을 평균으로 최소값을 구했다. 근데 맨해튼 거리에선 그게 아니라 중앙값이 최소라고 한다.$∣1−x∣+∣3−x∣+∣5−x∣+∣7−x∣+∣9−x∣$ 이다. x가 오른쪽으로 이동하면 왼쪽 점의 개수만큼 거리가 증가하고 오른쪽 점의 개수만큼 거리가 감소한다. 반대로 x가 왼쪽으로 이동하면 오른쪽 점의 개수만큼 거리가 증가하고 왼쪽 점의 개수만큼 거리가 감소한다.
수학적인 설명은 읽어봤지만, 간단하게 설명하면 1차원 위에 [1, 3, 5, 7, 9]의 점들이 있다고 하자. 어떤 위치 x에서 거리 합은
따라서, 왼쪽 점 개수 = 오른쪽 점 개수가 되어야 각 거리 합이 최소가 된다.
그래서 중앙값을 구해야 하고, 이 중앙값은 maxHeap, minHeap으로 쉽게 구할 수 있다.
다음은 각 점들과의 총 거리를 구하는 방식이다.
내가 처음 시도한 방식은 중앙값이 변활 때 기존 점들의 거리 변화량을 계산해 구하려고 했다. 하지만, 내 풀이 방식 상 새로운 점이 들어왔을 때, 이동한 점이 기존 점인지 새로운 점인지에 따라 계산이 달라지고,
swap()까지 일어나면 그 점들을 계속 추적해야 해 복잡했다.따라서, x값은 누적으로 구하고
upperQueue와lowerQueue의 합을 계산해upperVal와lowerVal를 따로 구한다.long ySum = (median * lowerQueue.size() - lowerVal + upperVal - median * upperQueue.size())로 y거리 합을 계산한다.⏳ 회고
간단한 게 풀려고 시도해야 한다. 그리고 기존 점들의 거리 변화량에 따라 값을 구하려고 했지만, 뭔가 실질적으로 변화하는 값을 정의하기가 어려웠다. 문제를 풀 때, 내가 계산하고자 하는 값을 구체적으로 설명할 수 있는 풀이를 해야겠다. 그리고 꼭 int의 오버플로우를 확인하자. 꼭