티스토리 뷰
문제
땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
출력
첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.
예제 입력 1
2 1 5
예제 출력 1
4
해설
처음에는 매우 간단한 문제라고 생각했다. 왜 이런 문제가 <수학1>로 분류되었을까란 의구심이 살짝 고개를 들었지만....
첫 번째 코드이다.
#include <stdio.h>
int main(int argc, char *argv[])
{
int move_day, move_night, height, days = 1;
int move_sum = 0;
scanf("%d %d %d", &move_day, &move_night, &height);
while (1) {
move_sum += move_day;
if (move_sum < height) {
move_sum -= move_night;
} else {
break;
}
days++;
}
printf("%d\n", days);
return 0;
}
코딩을 하면서도 루프로 돌릴 게 아니라 간단한 수식을 찾아야 하는 거 아니야 하는 생각이 들었지만 이번에도 무시했다. 이 간단한 연산과 루프에 얼마나 시간이 걸리겠어? 루프로 돌리면서 정상에 오른 날에는 미끄러지지 않는다는 점을 if문으로 처리했다. 출력이 정확하니 이제 채점을 받아볼까? 결과는 시간 초과
였다. 문제를 다시 살펴보니 시간 체한이 0.15 초 (추가 시간 없음)였다. 결국 루프를 돌리지 말라는 이야기다.
하루 이동 거리는 간단한데 정상에 올랐을 때는 미끄러지지 않는다는 점을 수식에 어떻게 반영할 수 있을까? 하루 이동 거리는 올라간 거리(move_day)에서 미끄러진 거리(move_night)를 빼면 된다. 그런데 정상에 오른 날 미끄러지지 않는다는 건? 우리가 알고 앂은 건 달팽이의 매일 이동 거리의 누계라고 할 때 마지막날에는 이 누계에서 미끄러진 거리가 제외된다는 의미이므로 전체 거리 height에서 미끄러진 거리(move_night)를 빼면 우리가 원하는 이동 거리 누계가 된다. 따라서 전체 이동할 거리(height - move_night)를 매일 이동 거리(move_day - move_night)로 나누면 달팽이가 며칠 만에 정상에 오르는지 알 수 있다.
days = (height - move_night) / (move_day - move_night);
이때 유의해야 하는 것은 나눗셈이 정수로 떨어지지 않은 경우는 하루가 더 추가된다는 점이다. 이 부분을 아래와 같이 따로 처리해 주어야 한다.
if((height - move_night) % (move_day - move_night) != 0) {
days++;
}
다시 완성한 코드는 아래와 같다. 이번 코드는 당연히 시간 제한에 걸리지 않았다.
소스코드
#include <stdio.h>
int main(int argc, char *argv[])
{
int move_day, move_night, height, days;
scanf("%d %d %d", &move_day, &move_night, &height);
days = (height - move_night) / (move_day - move_night);
if((height - move_night) % (move_day - move_night) != 0) {
days++;
}
printf("%d\n", days);
return 0;
}
'Python > 심사문제' 카테고리의 다른 글
백준(BAEKJOON): ACM 호텔(10250번) (0) | 2020.04.12 |
---|---|
백준(BAEKJOON): 부녀회장이 될테야(2775번) (0) | 2020.04.11 |
백준(BAEKJOON): 분수찾기(1193번) (0) | 2020.04.10 |
백준(BAEKJOON): 벌집(2292번) (0) | 2020.03.29 |
백준(BAEKJOON): 손익분기점(1712번) (0) | 2020.03.28 |
- Total
- Today
- Yesterday
- QLabel
- locallibrary
- QComboBox
- setText()
- 소수
- python3
- 리규찬
- Tistory
- BOJ
- books
- Mac
- C
- 유래
- 북한말
- baekjoon
- words
- 리찬규
- 백준
- MacOS
- QGridLayout
- QtDesigner
- 어원
- django
- judge
- QLineEdit
- tips
- PyQt5
- Python
- NK
- word
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |