ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.