PS, 언어 공부/알고리즘 문제풀이

[C++] 백준 온라인 저지 2869

Emil :) 2020. 9. 16. 14:41
728x90
반응형

문제


www.acmicpc.net/problem/2869

 

2869번: 달팽이는 올라가고 싶다

첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)

www.acmicpc.net

설계


이 문제는 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
반응형