코딩테스트/백준 단계별

[ 백준 7단계 ] 2869 달팽이는 올라가고 싶다.

scone 2022. 5. 13. 13:23

🥕 [ 백준 2869 ] 달팽이는 올라가고 싶다.

문제 링크

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

 

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

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

www.acmicpc.net

 

🍒 문제 분석

달팽이는 낮에 A만큼 올라가고 밤에 B만큼 내려갑니다.

V 높이에 도달하고 싶은 달팽이는 얼마나 걸릴까요

 

🥑 코드

import sys
A, B, V = map(int, sys.stdin.readline().split() )
day = (V-A) // (A-B)
temp = (A-B)*day
while True :
    temp += A
    day += 1
    if temp >= V:
        break
    temp -= B

print(day)

 

🍓 내 해결 과정

1. 첫 시도

처음에는 그냥 day 0 부터 시작해서 V 도달 할때 까지 while 문 돌렸는데 시간초과가 나왔습니다.

 

2. 몇번의 시도 이후

V 에서 A만큼을 뺀 값을, 아침과 밤에 이동한 높이 (A-B) 로 나눈 후 day 값에다가 넣어줬습니다.

 

여기서부터 반복분을 돌려서 시간을 단축해 문제를 풀었습니다.

 

🌽 다른 사람 코드

JK 님 코드

import math
a, b, v = map(int, input().split())
print(math.ceil((v-b)/(a-b)))

(V-B) 를 (A-B) 로 나눈 뒤 올림 값을 구해서 주황색으로 표시한 부분에 가기까지의 day를 구했다.

만약 그 위치가 V와 같다면, 답을 구한 셈이고

 

만약 그 위치가 V보다 조금 밑에 있다면, B만큼 밤에 내려오기 전에 도착했다는 의미이므로

마찬가지로 그 위치가 답이 된다.

 

반복문 돌릴 필요도 없이 바로 구한 셈.

 

🍉 깨달은 점 및 정리

 

일반적으로는 반복문 돌려야겠다라는 생각으로 푸는게 맞는거고

JK님과 같은 직관적인 해답은 앞으로 생각하는 힘을 계속 기르면서 문제 보자마자 바로 떠오를 날이 있기를 바라야하지 않을까..

 

일단 한가지 크게 깨달은 건

머리로만 풀지말고 그림 그려가면서 푸는게 더 빠른다는 거