https://www.acmicpc.net/problem/2597
시간 1초, 메모리 128MB
input :
output :
조건 :
빨간 점이 만나도록 줄자를 접었다. 그런 후 두 파란 점이 만나도록 줄자를 접고, 또 다시 두 노란 점이 만나도록 줄자를 접었다
두 점이 이미 만나고 있으면, 그 두 점에 대해서는 줄자를 접지 않는다.
인제야.. 실패 딱지를 지웠다. 가장 큰 문제는 경우를 너무 많이 나눈 것 같다.
줄자를 접을 때 점의 위치를 한정 지으려 한 것이 패착이었다. 차라리 어느 방향으로 접는지에 집중을 했어야 했다.
-> 현재 길이에서 중간을 찾아 이보다 큰 위치인지 확인한다.
-> 반복문을 통해 업데이트가 필요하다.
접는 위치를 기준으로 오른쪽이 더 짧은 경우(오른쪽의 줄자를 접는다.)
=> 줄자의 시작 위치가 동일하기 때문에 줄자의 길이만 줄이면 된다.
if mid < left:
left = mid - (left - mid)
if mid < right:
right = mid - (right - mid)
mid를 중심으로 차이를 구해서 빼기만 하면 된다. 해당 하는 점의 위치가 mid보다 큰 경우에만.
왼쪽이 더 짧을 때.
=> 줄자의 시작위치가 접는 위치로 바뀌기 때문에 점의 위치를 업데이트하는 방법이 조금 다르다.
left = mid - left if left < mid else left - mid
right = mid - right if right < mid else right - mid
mid에서 원래 위치를 빼게 되면 시작 위치를 0으로 옮겼을 때의 위치를 얻을 수 있다. 걍 절대값? 차이를 구한다고 보면 된다.
import sys
length = int(sys.stdin.readline())
node = []
for _ in range(3):
x, y = map(int, sys.stdin.readline().split())
node.append((min(x, y), max(x, y)))
for i in range(3):
x, y = node[i]
if x == y:
continue
mid = (x + y) / 2
if length - mid <= mid:
length = mid
for j in range(i, 3):
left, right = node[j]
if mid < left:
left = mid - (left - mid)
if mid < right:
right = mid - (right - mid)
node[j] = (min(left, right), max(left, right))
else:
length -= mid
for j in range(i + 1, 3):
left, right = node[j]
# 시작점(mid)을 0으로 두기 위해 좌표들을 이동시킴.
left = mid - left if left < mid else left - mid
right = mid - right if right < mid else right - mid
node[j] = (min(left, right), max(left, right))
print(length)