새소식

PS/백준

[백준/2597] 줄자접기 (Python)

  • -

Problem : https://www.acmicpc.net/problem/2597

 

2597번: 줄자접기

첫째 줄에 줄자의 길이가 입력된다. 줄자의 길이는 10㎝ 이상, 1,000㎝ 이하이고 단위를 나타내는 ㎝은 입력되지 않는다. 둘째 줄에는 두 빨간 점의 위치를 나타내는 정수가 빈칸을 사이에 두고 입

www.acmicpc.net

 

Difficulty : Silver 3

 

Status : Solved

 

Time : 00:38:26

 


 

문제 설명

 

더보기

준성이는 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))

풀이 완료~

'PS > 백준' 카테고리의 다른 글

[백준/2116] 주사위 쌓기 (Python)  (0) 2023.03.10
[백준/2642] 전개도 (Python)  (0) 2023.03.09
[백준/2436] 공약수 (Python)  (0) 2023.03.05
[백준/2636] 치즈 (Python)  (0) 2023.03.04
[백준/2658] 직각이등변삼각형찾기 (Python)  (0) 2023.03.04
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.