[코딩테스트] 백준 #2869 문제 풀이

재오·2022년 9월 26일
1

코딩테스트

목록 보기
7/46
post-thumbnail

문제만 보면 그렇게 어려워 보이지 않는 문제이다. 처음에는 반복문으로만 작성을 했었다.

while(true)
{
	Day = Day + 1;
    M = M + A;
    if(M >= V) break;
    else M = M - B;
}

그런데 문제를 보니까 정수를 10억까지 입력할 수 있다. 10억을 반복문으로 돌리면 시간초과가 날 수 밖에 없었다. 실제로 제출했을 때 시간초과가 떴다...

결국 이 문제는 수식을 변형해서 반복문을 사용하지 않고 풀어야 하는 문제이다.

우리가 최종 목적지를 V로 잡으면 안된다. A만큼 이동할 때에는 미끄러지지 않으므로 V-A로 최종목표를 잡아야 한다. 어짜피 A만큼 이동하게 된다면 하루가 지나게 되므로 그 날은 무시가 가능해여 한다. 그렇다면 V-A 를 A-B로 나눈 만큼이 지나간 하루가 될 것이다. 정확히 0으로 나누어 떨어지면 그 날이 흘러가 날짜이고 만약 0이 아니라면 하루를 더 해줘야할 것이다.

그렇다면 코드는 다음과 같다.

#include <iostream>

using namespace std;

int main()
{
    int A, B, V;
    int Day;
    
    cin >> A >> B >> V;
    
    if((V-A) % (A-B) == 0) Day = (V-A) / (A-B);
    else Day = (V-A)/(A-B) + 1;
    
    cout << Day + 1;
}
profile
블로그 이전했습니다

0개의 댓글