[구현] 백준(2869)_ 달팽이는 올라가고 싶다 문제풀이

SeHoony·2022년 5월 1일
1
post-thumbnail

백준 2869 : 달팽이는 올라가고 싶다
https://www.acmicpc.net/problem/2869

1. 문제 이해

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다. 달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

문제에서 볼드처리한 부분이 문제의 키라고 생각했다.

저 문장을 기점으로 조건을 나눌 수 있다.
1) 'A가 V보다 더 클 때'와 'A가 V보다 작을 때'로 나눈다.

2) 'A가 V보다 더 클 때'는 하루 만에 끝나니 print(1)!

3) 'A가 V보다 작을 때'는 두 조건으로 나눌 수 있다.
[전제] A-B씩 올라가다가 마지막은 A만큼 오르는 것으로 도착지점에 도달할 것이다.
=> (아이디어) 마지막 A만큼을 뺀 총 길이(V-A)에서 (A-B)를 나눈 몫에서 +1을 하면 답이 나오지 않을까?

  • 3-1) (V-A) % (A-B) == 0 : (V-A) // (A-B) +1 프린트
    : V에서 A만큼 뺀 총 길이에 A-B 길이가 딱 나눠 떨어지니까 마지막에 A만큼 1 더 가면 된다.
  • 3-2) (V-A) % (A-B) != 0 : (V-A) // (A-B) +2 프린트
    : V에서 A만큼 뺀 총 길이에 A-B 길이가 안 나눠 떨어진다는 것은 A-B만큼 한 번 더 갈 수 있고, 그 결과 A보다 적은 길이가 남게 된다는 뜻이다. 따라서 A-B만큼 한 번, A보다 적은 길이도 한 번 해서 2를 더해준다.

2. 문제풀이(틀린 풀이)

from sys import stdin;
input = stdin.readline;

if __name__ == "__main__":
    A, B, V = map(int, input().split()); # 낮 올 // 밤 내 // 총 길이
    
    if A > V :
        print(1);
    else :
        print((V-A) // (A-B) + 1);

조건을 더 구체적으로 생각해보지 못했다.

3. 문제풀이(정답 풀이)

# from sys import stdin;
# input = stdin.readline;

A, B, V = map(int, input().split()); # 낮 올 // 밤 내 // 총 길이

if V < A : 
    print(1);
else:
    if (V-A) % (A-B) == 0 :
        print((V-A) // (A-B) +1)
    else :
        print((V-A) // (A-B) +2)

stdin.readline() 쓸 때 72ms가 나왔는데, input()을 쓰니까 68ms가 나왔다. 입력받는 값이 적을 때는 그냥 input()을 써도 좋을 것 같다.

4. 느낀점

브론즈1 문제였지만 나한테는 너무 어려웠다. 구상한데로 구현이 끝났는데도 답이 틀렸다고하니 머리가 점점 무거워지는 느낌이었다. 문제를 보고 초장에 정답을 할 수 있도록 문제를 이해하고 조건을 세부적으로 구상할 수 있도록 연습을 많이 해야겠다고 생각했다.

profile
두 발로 매일 정진하는 두발자, 강세훈입니다. 저는 '두 발'이라는 이 단어를 참 좋아합니다. 이 말이 주는 건강, 정직 그리고 성실의 느낌이 제가 주는 분위기가 되었으면 좋겠습니다.

0개의 댓글