본문 바로가기

코딩테스트

백준 2869 : 달팽이는 올라가고 싶다.

728x90

2869 달팽이는 올라가고 싶다.

  • 문제를 보고 바로 생각한것은 그냥 반복문 쓰면 빠르게 해결될 것이다? 라는 생각이였다.
  • 하지만 반복문으로 해본 결과 시간제한 1초가 나왔고, 문제에서는 시간제한이 0.25초 였던 것이다.
a, b, v = map(int, input().split())
x, y = 0, 0

def func(a, b, v):
    global x, y
    while True:
        y += 1
        x += a
        if x >= v:
            return y
        else:
            x -= b
print(func(a, b, v))

위 코드가 반복문을 사용해서 했던 코드이다.

그럼 시간 초가 촉박한 문제들을 과거에는 어떻게 풀었을까?
  • 나의 경우는 시간초가 짧은 문제들은 공식화 해서 풀거나 삼항연산자를 많이 이용했던 것 같다.
아이디어
  • 이 문제에서는 구하려고 하는 것이 결국은 며칠이 걸렸는지 날짜를 구하는 것이다.
  • 날짜는 총 거리 / 움직이는 거리 이며, 문제에서 a, b, v로 변수를 지정해 주었으니 하루동안 움직인 거리는 a-b가 되는 것이다.
  • 여기서 a는 낮에 올라간 거리, b는 밤에 미끄러지는 거리 이므로, 마지막날 낮에 올라가 목표지점에 도착하게 되면 그 다음날은 b를 빼줄 이유가 없는 것이 핵심인 것 같다.
  • day = v/a-b 라고 하면 원하는 값에서 1씩 크게 나오는 오류를 범할 수 있으므로, 높이에 대해 다시 정리하면 v = day * (a-b) + a가 되는 것이다.
  • day = (v-a)/(a-b) 인 것이다.
  • 여기에 마지막 날은 1로해서 본 식에 더해주면 최종 공식이 완성된다.
  • 테스트를 하는 도중 결과값이 정수로 안나오고 실수로 나오는 경우가 발견되었다. (예제 입력 2 를 넣은 경우 1.xxx 이렇게 나옴)
  • 1.xxx 의 결과각ㅄ이 나오는 경우는 날짜는 정수이므로 2일이 필요한 것이다 이를 코드에 수정 보안해주었다.
a, b, v = map(int, input().split())
day = (v - a) / (a - b) + 1
print(int(day) if day == int(day) else int(day)+1)

day == int(day)를 통해 계산된 날이 정확히 정수라면 그대로 출력하고, 소수점이 있다면 하루를 더하여 출력한다.

728x90