신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://bluemiv.tistory.com/

문제

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)

출력

첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.

 

Python 문제 풀이

처음에는 문제가 쉽다고 생각했는데, 주의할 점이 있다.

맨 꼭대기까지 올라갔을때는 미끄러지지 않는다는 것을 고려해야 한다.

 

애초에 나무의 값에서 낮에 올라가는 길이를 빼서 계산을 했다. (그림 1. 참고)

  • 경우 1. 델타(낮과 밤의 이동거리의 차이)로 나누었을때, 딱 떨어진다면 낮에 움직여주면(+1) 정상에 도달한다.
  • 경우 2. 마찬가지로 델타로 나누었을때, 소숫점이 남아있다면 하루 더 올라가야 한다. (+1) 그리고 낮에 이동하면 정상에 도달한다. (+1)

그림 1. 이해를 돕기 위한 그림

import sys


def solution(morning, night, tree):
    """ex2869. 달팽이는 올라가고 싶다

    morning: 낮에 올라간 거리
    night: 밤에 미끄러진 거리
    tree: 나무의 높이

    cur_height: 현재 높이
    day: 일
    """
    if morning >= tree:
        return 1

    delta = (morning - night)
    day = (tree - morning) // delta

    if (tree - morning) % delta == 0:
        return day + 1
    else:
        return day + 2


if __name__ == "__main__":
    a, b, v = map(int, sys.stdin.readline().split())
    print(solution(a, b, v))

그냥 단순히 반복문을 돌려서 문제를 푸는 방법도 있지만, 그렇게 풀면 시간초과가 발생하기 때문에 정답을 맞힐 수 없다.

 

그렇기 때문에 마지막 순간만 고려해서 문제를 푸는것이 좋다.

 

결과

문제 풀이 결과

본 글은 직접 문제를 풀어보고 작성한 글입니다.
더 좋은 방법이 있거나 틀린부분이 있다면 댓글로 공유해주세요!

문제 원본

https://www.acmicpc.net/problem/2869

 

2869번: 달팽이는 올라가고 싶다

문제 땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다. 달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다. 달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오. 입력 첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000) 출력 첫째 줄에 달팽

www.acmicpc.net

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기