💻 Problem
준성이는 1㎝ 간격으로 눈금이 매겨져 있는 줄자를 가지고 있다. 그 줄자에 있는 서로 다른 눈금 6개에 한 눈금에 하나씩 점이 찍혀 있는데, 빨간 점, 파란 점, 노란 점이 각각 두 개씩 있다.
준성이는 먼저 빨간 점이 만나도록 줄자를 접었다. 그런 후 두 파란 점이 만나도록 줄자를 접고, 또다시 두 노란 점이 만나도록 줄자를 접었다. 줄자는 투명하여 접더라도 점들을 잘 볼 수 있다. 어떤 색깔의 두 점이 만나도록 줄자를 접었을 때, 그다음에 접으려는 색깔의 두 점이 이미 만나고 있으면, 그 두 점에 대해서는 줄자를 접지 않는다.
예를 들어 길이 10㎝ 인 줄자에 아래 그림과 같이 2㎝ 와 7㎝ 위에에 두 빨간 점이 찍혀 있고, 5㎝ 와 4㎝위치에 파란 점이, 10㎝ 와 3㎝ 위치에 노란 점이 찍혀 있다고 하자. (그림에서 빨간 점은 별표로, 파란 점은 동그라미, 그리고 노란 점은 네모로 표시되어 있다.) 빨간 두 점이 만나도록 줄자를 접으면 줄자의 4.5㎝ 위치에서 접히고 4㎝ 와 5㎝ 눈금이 서로 만나게 된다. 그러면 줄자의 왼쪽 부분의 길이는 4.5㎝이고 오른쪽 부분의 길이는 5.5㎝가 되어, 접힌 줄자의 길이는 5.5㎝ 가 된다. 파란 두 점은 이미 만나므로 줄자를 접지 않고, 그런 다음 노란 두 점이 만나도록 접으면 줄자의 길이는 3.5㎝ 가 된다.
줄자의 길이와 각 색깔의 점들이 찍혀있는 위치가 주어질 때, 준성이가 빨간 색, 파란색, 노란색의 순서로 두 점이 만나도록 줄자를 접으면 줄자의 길이가 얼마가 되는지를 구하는 프로그램을 작성하시오.
💡 Approach
처음에는 줄자를 접었을 때 점의 위치도 반대쪽으로 찍혀야 되는지 모르고 틀렸다.
점을 반대쪽으로 찍혀야 한다는 걸 알았을 때는 어느 방향을 접어야 할지 고민됐다..
접었을 때 더 긴 길이가 줄자의 접은 길이가 된다는 건 아는데, 어느 쪽으로 접히느냐에 따라 위치 갱신을 다르게 해줘야 한다고 생각해서 머리가 너무 복잡했다..
이 고민은 mid(줄자를 접은 위치)를 0으로 잡으면 된다는 걸 깨닫고 바로 해결됐다.
줄자의 길이가 10이고 4.5에서 접었으면 4.5~10 이 부분을 써야 한다고 생각해서 접은 위치들을 다 기록해야 되나? 싶었는데..
접은 정보를 가지고 mid를 0으로 새로 줄자를 만든다고 생각하면 된다.
예시의 경우, 빨간 점을 기준으로 접으면 mid가 4.5니까 mid 기준으로 파란색 왼쪽 점은 0.5, 파란색 오른쪽 점은 0.5, 노란색 왼쪽 점은 1.5, 노란색 오른쪽 점은 5.5가 되는 것이다.
mid를 0이라고 생각하니 쉬운 문제였다..!
그걸 알고나니 바로 풀렸다.
✏️ Solution
import sys
input = sys.stdin.readline
length = int(input())
dot = [list(map(int, input().split())) for _ in range(3)]
mid = 0
for i in range(3):
l, r = dot[i]
if l == r:
continue
mid = (l + r) / 2
for j in range(i + 1, 3):
dot[j][0] = abs(mid - dot[j][0])
dot[j][1] = abs(mid - dot[j][1])
length = max(mid, length - mid)
print(length)