BOJ 2597 줄자접기

LONGNEW·2022년 1월 7일
0

BOJ

목록 보기
288/333

https://www.acmicpc.net/problem/2597
시간 1초, 메모리 128MB

input :

  • N (10 ≤ N ≤ 1,000)
  • x y (점의 위치)

output :

  • 접은 후의 줄자의 길이를 소수점 이하 한자리까지 출력

조건 :

  • 빨간 점이 만나도록 줄자를 접었다. 그런 후 두 파란 점이 만나도록 줄자를 접고, 또 다시 두 노란 점이 만나도록 줄자를 접었다

  • 두 점이 이미 만나고 있으면, 그 두 점에 대해서는 줄자를 접지 않는다.


인제야.. 실패 딱지를 지웠다. 가장 큰 문제는 경우를 너무 많이 나눈 것 같다.

줄자를 접을 때 점의 위치를 한정 지으려 한 것이 패착이었다. 차라리 어느 방향으로 접는지에 집중을 했어야 했다.

다음 풀이

  1. 줄자를 접는다? 어느 방향으로
  2. 다름 점들의 위치는?

-> 현재 길이에서 중간을 찾아 이보다 큰 위치인지 확인한다.
-> 반복문을 통해 업데이트가 필요하다.

접는 위치를 기준으로 오른쪽이 더 짧은 경우(오른쪽의 줄자를 접는다.)
=> 줄자의 시작 위치가 동일하기 때문에 줄자의 길이만 줄이면 된다.

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)

0개의 댓글