-
2597. [Python]줄자접기Python_알고리즘/Silver III 2023. 6. 17. 22:54
1. 문제
https://www.acmicpc.net/problem/2597
2597번: 줄자접기
첫째 줄에 줄자의 길이가 입력된다. 줄자의 길이는 10㎝ 이상, 1,000㎝ 이하이고 단위를 나타내는 ㎝은 입력되지 않는다. 둘째 줄에는 두 빨간 점의 위치를 나타내는 정수가 빈칸을 사이에 두고 입
www.acmicpc.net
2. 접근 방법
- 시간 제한: 1초
- 메모리 제한: 128MB
- 구현
3. 파이썬 코드
N = int(input()) left = 0 right = N # 점을 순서별로 리스트로 오름차순 정렬하여 받음 red_point = sorted(list(map(int,input().split()))) blue_point = sorted(list(map(int,input().split()))) yellow_point = sorted(list(map(int,input().split()))) # 접히는 길이를 담을 변수 fold_length = 0 # 두 점의 위치가 다를 경우 if red_point[0] != red_point[1]: # 두 점의 접히는 점을 mid 변수로 받아옴 mid = (red_point[0]+red_point[1])/2 # 접히는 길이는 두 점의 중앙값 - left 값 fold_length = mid - left # 만약 파란점, 노란점 각각 위치가 접히는 mid 값보다 작은 경우 # 왼쪽을 기준으로 접기때문에 mid 라는 변수에 각각의 점들간의 거리를 계산 후 더한 값을 각각 점에 대입 if blue_point[0] < mid: blue_point[0] = mid + (mid-blue_point[0]) if blue_point[1] < mid: blue_point[1] = mid + (mid-blue_point[1]) if yellow_point[0] < mid: yellow_point[0] = mid + (mid-yellow_point[0]) if yellow_point[1] < mid: yellow_point[1] = mid + (mid-yellow_point[1]) # 모든 계산이 끝난 후 left 값 mid 로 갱신 left = mid # right 값은 기존 right 값과 총 접힌 부분의 길이 중 큰값을 right 값으로 갱신해준다. right = max(right,fold_length+mid) # 위 과정을 파란점 노란점일 떄 반복 시행 if blue_point[0] != blue_point[1]: mid = (blue_point[0]+blue_point[1])/2 fold_length = mid - left if yellow_point[0] < mid: yellow_point[0] = mid + (mid-yellow_point[0]) if yellow_point[1] < mid: yellow_point[1] = mid + (mid-yellow_point[1]) left = mid right = max(right,fold_length+mid) if yellow_point[0] != yellow_point[1]: mid = (yellow_point[0]+yellow_point[1])/2 fold_length = mid - left left = mid right = max(right,fold_length+mid) # 최종 값에서 right 값과 left 차를 구한다. print(f"{right-left:.1f}")
4. 문제를 풀고난 후 생각
- 항상 문제를 풀면서 구현 문제는 어려운 것 같다.
- 구현을 어떻게 하면 될지는 구상은 되지만 코드로 옮기는 과정에서 항상 생각지도 못한 변수들이 존재하여 한번에 통과하는 경우가 드문 것 같다.
- 제일 처음 생각 했던 문제는 그냥 각 점들마다 동시에 접고 제일 긴 값을 나타내면 되겠다 싶어서 간단하게 구현을 했더니 바로 틀렸다.
- 문제 자체가 이해되지 않아서 검색을 통해서 문제를 이해 하였고 어떻게 구현을 할지 고민을 많이 했다.
- 처음 길이의 중앙값을 찾아서 들어온 점의 중앙값이 그 값보다 큰지 작은지 판단하여 오른쪽으로 접는 경우 왼쪽으로 접는 경우 나눠서 그 경우에 따른 파란점과 노란점의 값들을 변화를 주는 식으로 구현을 했다.
- 이 경우에 어느 부분에서 반례가 생기는지 정확히 파악을 할 수 없어서 복잡한 방식으로 구현하는 것이 아닌 단순한 방식으로 구현을 하기로 했다.
- 점들의 중앙값이 어디든 무조건 왼쪽에서 오른쪽으로 접도록 처리를 진행하였다.
- 이러한 조건에 맞도록 각각의 점들도 다 값을 변경 시켜줬고 left, right 값도 계속해서 변경해 줬다.
- 예를 들어 N 값이 10 이면 right, left 값은 10보다 커져서 나아가도 결국 right - left 를 진행해주기 떄문에 접힌 길이는 변하지 않는다.
따로 패드로 그림을 그려서 첨부할 예정이지만 현재 어깨를 수술하여 불편하기 떄문에 치료가 된 후 추가할 예정입니다.
5. 문제를 푸는데 도움이 되는 지식
- 구현
'Python_알고리즘 > Silver III' 카테고리의 다른 글
2512. [Python]예산 (0) 2023.07.18 2503. [Python]숫자 야구 (0) 2023.07.13 1449. [Python]수리공 항승 (0) 2023.06.14 2346. [Python]풍선 터뜨리기 (2) 2023.06.13 2371. [Python]파일 구별하기 (1) 2023.06.11