준성이는 1㎝ 간격으로 눈금이 매겨져 있는 줄자를 가지고 있다. 그 줄자에 있는 서로 다른 눈금 6개에 한 눈금에 하나씩 점이 찍혀 있는데, 빨간 점, 파란 점, 노란 점이 각각 두 개씩 있다.
준성이는 먼저 빨간 점이 만나도록 줄자를 접었다. 그런 후 두 파란 점이 만나도록 줄자를 접고, 또 다시 두 노란 점이 만나도록 줄자를 접었다. 줄자는 투명하여 접더라도 점들을 잘 볼 수 있다. 어떤 색깔의 두 점이 만나도록 줄자를 접었을 때, 그 다음에 접으려는 색깔의 두 점이 이미 만나고 있으면, 그 두 점에 대해서는 줄자를 접지 않는다.
예를 들어 길이 10㎝ 인 줄자에 아래 그림과 같이 2㎝ 와 7㎝ 위에에 두 빨간 점이 찍혀 있고, 5㎝ 와 4㎝위치에 파란 점이, 10㎝ 와 3㎝ 위치에 노란 점이 찍혀 있다고 하자. (그림에서 빨간 점은 별표로, 파란 점은 동그라미, 그리고 노란 점은 네모로 표시되어 있다.) 빨간 두 점이 만나도록 줄자를 접으면 줄자의 4.5㎝ 위치에서 접히고 4㎝ 와 5㎝ 눈금이 서로 만나게 된다. 그러면 줄자의 왼쪽 부분의 길이는 4.5㎝ 이고 오른쪽 부분의 길이는 5.5㎝가 되어, 접힌 줄자의 길이는 5.5㎝ 가 된다. 파란 두 점은 이미 만나므로 줄자를 접지 않고, 그런 다음 노란 두 점이 만나도록 접으면 줄자의 길이는 3.5㎝ 가 된다
줄자의 길이와 각 색깔의 점들이 찍혀있는 위치가 주어질 때, 준성이가 빨간 색, 파란 색, 노란 색의 순서로 두 점이 만나도록 줄자를 접으면 줄자의 길이가 얼마가 되는지를 구하는 프로그램을 작성하시오.
첫째 줄에 줄자의 길이가 입력된다. 줄자의 길이는 10㎝ 이상, 1,000㎝ 이하이고 단위를 나타내는 ㎝은 입력되지 않는다. 둘째 줄에는 두 빨간 점의 위치를 나타내는 정수가 빈칸을 사이에 두고 입력된다. 셋째 줄에는 두 파란 점의 위치가, 넷째 줄에는 두 노란 점의 위치를 나타내는 정수가 빈칸을 사이에 두고 입력된다. 모든 점들의 위치는 서로 다르다.
출력
한 줄에 접은 후의 줄자의 길이를 소수점 이하 한자리까지 출력한다. 소수점 이하 한자리가 0 이면 0 도 출력한다.(예 4.0)
입력 예시
10
2 7
5 4
10 3
출력 예시
3.5
풀이
쉬운 문제였는데, 생각보다 오래 해멨다.
처음 가장 왼쪽, 가장 오른쪽 좌표를 0, length로 잡고 넘어가자.
두 점의 좌표가 같다면 넘어간다. 두 점 사이의 거리 mid를 구한다. mid를 기준으로 모든 오른쪽에 있는 좌표는 (mid*2 - 원래 좌표)로 구할 수 있다. (mid 에서 거리값인 오른쪽 좌표 - mid를 빼면 된다).
새로운 가장 오른쪽 좌표는 mid가 되며, mid 기준으로 오른쪽에 위치한 이후의 점들에 대해서 위와 같은 방식으로 이동한다. 한편, 가장 왼쪽 좌표는 오른쪽 좌표를 위 방식으로 이동하였을 때, 더 작은 값일 경우 업데이트한다. (줄자의 길이는 긴 쪽을 기준으로 잡기 때문이다).
세 번의 반복 후 (가장 오른쪽 좌표 - 가장 왼쪽 좌표)를 출력한다.
풀이 코드
rlen = int(input())
llen = 0
point_list = [list(map(float, input().split())) for _ in range(3)]
for i in range(3) :
a, b = point_list[i]
if a == b :
continue
mid = (a + b) / 2
rlen, llen = mid, min(llen, mid*2 - rlen)
for j in range(i+1, 3) :
for k in range(2) :
if point_list[j][k] > mid :
point_list[j][k] = mid*2 - point_list[j][k]
print('{:.01f}'.format(rlen - llen))