2869번: 달팽이는 올라가고 싶다 (acmicpc.net)
문제
땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
출력
첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.
풀이
정상에 일단 다다르기만 하면 미끄러지지는 않으므로, 최종적으로 가야하는 목표는 V가 아닌 V-A까지만 가면 다음날 아침에 A만큼 올라서 정상에 다다를 수 있다.
그리고 V-A를 가는데에 걸리는 기간은 (V-A)/(A-B)이다.
이때 (V-A) / (A-B)가 나머지가 0일 경우에는 (V-A) / (A-B) 일 만큼 오르고, 마지막날 A만큼 오르면 되지만,
(V-A) / (A-B)의 나머지가 0이 아닐 경우에는 정상에 도달하기에 이동거리가 조금 모자라므로 1을 추가로 더해주면 된다.
반복문을 사용할 경우 무조건 시간초과가 발생하는 문제이다.
목표점이 V가 아닌 V-A라는 것을 캐치하는것이 관건이고, 그 후 (V-A) % (A-B)를 활용하여 1을 더해줄지 안더해줄지를 결정하는 것이 정답으로의 접근 방법이다.
#include <iostream>
using namespace std;
int main() {
int a,b,v;
cin >> a >> b >> v;
int day = 1;
day += (v-a)/(a-b);
if((v-a)%(a-b) != 0)
day++;
if(a >= v)
cout << "1";
else
cout << day;
return 0;
}
오답코드1
오류 이유: 이렇게 풀었는데 마지막 예제3번에서 에러?가 떴다. 시간초과 때문 같은데 구글링을 해보니
반복문을 통해 높이를 오르려고 할 경우, V의 범위가 최대 1,000,000,000이므로 시간초과가 발생한다고 한다.
따라서, 몇일이 걸리는지를 수학적으로 식으로 구현하여야 한다.
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
int main()
{
int a, b, v;
int cnt = 0;
cin >> a >> b >> v;
int climb=a;
if (climb < v)
{
climb = climb - b;
cnt++; //하루 지남
}
while (climb < v)
{
climb = climb + a;
if (climb < v)
{
climb = climb - b;
cnt++;
}
else {
cnt++;
}
};
cout << cnt;
return 0;
}
오답코드2
나름 수식을 사용해서 작성했는데 틀림
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
int main()
{
int a, b, v;
double cnt;
cin >> a >> b >> v;
cnt = (v + b) / a;
cout << cnt+1;
return 0;
}
'Algorithm > C++' 카테고리의 다른 글
프로그래머스 - 2017 팁스타운 -예상 대진표 - C++ / 기본 수학 (0) | 2021.06.27 |
---|---|
백준 - 10250- ACM 호텔 - C++/ 나머지, 몫 활용 (0) | 2021.03.08 |
백준 - 4344 - 평균은 넘겠지 - C++ / 2차원 배열 동적 할당 (0) | 2021.03.08 |
백준 - 1157 - 단어공부 - C++ /예외조건삽입 (0) | 2021.03.07 |
백준 - 2941 - 크로아티아 알파벳 - C++ /String 내부 함수 find, replace (0) | 2021.03.06 |
댓글