티스토리 뷰
>문제
땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
>핵심
반복문 이외의 방법을 생각하자
나머지를 활용하자
>풀이과정
처음에 문제를 보고, 문제 쉽네 하고 무작정 반복문으로 돌리다가
시간제한이라는 큰 문제에 빠져 고민하게 했던 문제.
[정상에 올라간 후에는 미끄러지지 않는다]
그러므로 마지막날에는 내려가는 길이를 계산할 필요가 없다.
또한, 최소 달팽이가 V-A 위치에 있어야 다음날 정상에 다다를 수 있다. 하루에 A를 올라가니까.
그래서 V-A 위치를 기준으로 잡고 하루에 달팽이가 이동하는 총 거리, A-B를 이용해 나머지 연산을 한다.
(V-A) % (A-B) 가 0인 경우, 하루가 끝났을 때 달팽이가 V-A점에 위치하고 있다는 의미이므로,
다음날 바로 정상에 다다를 수 있다.
반면, (V-A) % (A-B) 가 0이 아닌 경우(살짝 못미친 경우), 하루를 추가로 오르락 내리락 하고 나서야
정상에 다다를 수 있다.
다른 사람들 풀이를 보니 다들 쉽게 푸는 문제라고 하는데
난 이거 이해하는데 한참 걸렸다.
코딩은 역시 타고난 재능이 있어야 하는가보다. 현타가 온다. 쩝.
>코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int A, B, V, cnt = 0;
scanf("%d %d %d", &A, &B, &V);
if (A == V)
{
printf("1\n");
return 0;
}
if ((V - A) % (A - B) == 0)
{
cnt = (V - A) / (A - B);
}
else
cnt = (V - A) / (A - B) + 1;
printf("%d\n", cnt + 1);
return 0;
}
'알고리즘 > 기타' 카테고리의 다른 글
[C] 백준 | 1181번 코드 - 단어 정렬 (1) | 2021.02.23 |
---|---|
[C] 백준 | 1018번 코드 - 체스판 다시 칠하기 (0) | 2021.02.22 |
[C] 백준 | 2839번 코드 - 설탕배달 (0) | 2021.02.21 |
[C] 백준 | 15829번 코드 - Hashing (0) | 2021.02.21 |
[C] 백준 | 2292번 코드 - *벌집 (0) | 2021.02.21 |
댓글