728x90
반응형
문제
설계
이 문제는 1712 손익분기점이랑 상당히 흡사하다.
하지만 다른점이 있다면 일자로 계산하기 때문에
계산식에서 조금 다르게 해줘야 하는 점이 있다.
내 처음 코드는 다음과 같은데, 여기에 오류를 먼저 설명하겠다.
#include <iostream>
using namespace std;
int main(void){
int up, down, top;
cin >> up >> down >> top;
int answer = top / (up - down);
cout << (answer >= top ? answer - 1 : answer + 1);
return 0;
}
하루가 지나면 올라가는 총량은 up에서 down을 뺸 것과 같다.
그래서 꼭대기 까지 올라가는데 걸리는 시간은 answer가 되는데, 여기서 함정이 있다.
예를 들어 각각
5 3 13
5 3 14
가 입력됐다고 가정해보자.
5 3 13은
1일차 - 2
2일차 - 4
3일차 - 6
4일차 - 8
까지 오는데, 다음날인 5일차 저녁이 되기 전에 끝까지 올라오기 때문에
answer의 값은 13 / (5 - 3) 인 6이 되고, 마지막에 올라오는 날 +1 해줘서 답은 7이 된다.
그렇다면 이제 다른 반례를 보자.
5 3 14는
1일차 - 2
2일차 - 4
3일차 - 6
4일차 - 8
5일차 - 10
까지 온 다음에, 다음날인 6일차에 다 오를 수 있게된다.
그런데 저 소스대로 한다면 답은 마찬가지로 7이 된다.
그냥 둘다 틀린거다. 그래서 고민을 좀 해본 결과.. 이렇게 짰다.
int up, down, top;
cin >> up >> down >> top;
int answer = (top - up) / (up - down);
int flag = (top - up) % (up - down);
cout << (flag == 0 ? answer + 1 : answer + 2);
이렇게 하면 answer는 꼭대기에 딱 오르게 되기 때문에 첫날을 +1 해주고,
만약 나누어 떨어지지 않는다면 다음날에 무조건 오르기 때문에 첫날과 다음날 해서 +2 해줬다.
코드
#include <iostream>
using namespace std;
int main(void){
int up, down, top;
cin >> up >> down >> top;
int answer = (top - up) / (up - down);
int flag = (top - up) % (up - down);
cout << (flag == 0 ? answer + 1 : answer + 2);
return 0;
}
결과
그렇게 많이 어렵진 않았다. 만족!
구독 및 하트는 정보 포스팅 제작에 큰 힘이됩니다♡
728x90
반응형
'PS, 언어 공부 > 알고리즘 문제풀이' 카테고리의 다른 글
[알고리즘 이론] 다익스트라(Dijkstra), 최단 경로 알고리즘 (0) | 2022.04.24 |
---|---|
[Python] 백준 온라인 저지 1003 (0) | 2022.04.23 |
[C++] 백준 온라인 저지 2292 (0) | 2020.09.09 |
[C++] 백준 온라인 저지 1712 (0) | 2020.09.08 |
[JAVA] 백준 온라인 저지 9012 (0) | 2020.06.25 |