7/22 백준

j3rry3·2021년 7월 22일
0

<2869> 달팽이는 올라가고 싶다

내가 쓴 코드

#include <iostream>

using namespace std;

int main() {
	cin.tie(NULL); 
	ios::sync_with_stdio(false);

	// A B V      V + x*B <= A*x  V <= (A-B)*x >> V/(A-B) <= x
	// 1. 아침 +2 밤 -1 2. 아침 +2 밤 -1
	int A, B, V, x = 1, T;
	cin >> A >> B >> V;
	T = A;
	while (1)
	{
		if (V - T <= 0) // 3 2 1 0
			break;
		T += A - B;
		x++;
	}
	cout << x;

	return 0;
}

while문 안에서 계속 더해줘야해서 큰 수가 들어가면 시간초과가 발생한다.

그래서 찾아본 코드

#include <iostream>

using namespace std;

int main() {
	cin.tie(NULL); 
	ios::sync_with_stdio(false);

	int A, B, V;
	int day;

	cin >> A >> B >> V;
	day = (V - B - 1) / (A - B) + 1;
	cout << day;

	return 0;
}

A-B 는 하루동안 달팽이가 올라가는 높이이다.
하지만 이미 도착한 날에는 미끄러지지 않으므로 달팽이가
올라가는 총 높이는 V-B가 된다.
그래서 (V-B)/(A-B)를 하면 되는데 만약 딱 나누어 떨어지지 않는 경우는 하루 더 가야하므로 +1을 해준다.
하지만 그러면 딱 나누어떨어지는 경우에는 정상을 오른 상태에서 하루 더 가는 것이므로 분자에서 -1을 해주어서 맞게 해준다.
ps. 이분탐색으로 구하는 방법도 찾아보자.


cin.tie(NULL); 은 cin 과 cout의 묶음을 풀어준다.
cin으로 데이터를 읽을 때 출력 버퍼에 있는 내용을 비우는데 비우지 않고 먼저 입력을 받는다.

ios::sync_with_stdio(false); 는 C와 C++의 버퍼를 분리하는 역할을 한다.

두 구문으로 cin과 cout을 조금 더 빠르게 쓸 수 있다.


0개의 댓글

관련 채용 정보