[백준/C++] 2869번: 달팽이는 올라가고 싶다

꿈별·2022년 12월 1일
0

문제풀이

목록 보기
12/52

문제


오답

처음에 아무생각 없이 while 반복문으로 작성한 코드다.
올라가는 데 걸린 날짜가 정상적으로 출력되긴 하지만 입력된 숫자가 커지면 시간이 초과된다.

#include <iostream>
using namespace std;

int main(void) {
	int V, A, B; //높이, 낮+, 밤-
	int record = 0; //현재 높이(기록)
	int day = 0; //소요일

	cin >> A >> B >> V;
	
	while (record < V)
	{
		record += A;
		if (record < V)
		{
			record -= B;
		}
		day++;
	}
	cout << day;
}

풀이2

  • V만큼 올라갔을 때의 day(소요일)를 찾는 게 목표지만,
    굳이 V까지 올라가는 것을 계산해보지 않아도 (V-A)에 도달한 다음날 낮에 V에 도달한다는 걸 알기 때문에
    -> (V-A)에 도달한 날짜에서 +1을 해주면 된다.
  • 또한, 하루에 올라가는 높이는 (A-B)이기 때문에
    day=(V-A)/(A-B)+1 가 된다.
    -> 이 때, (V-A)%(A-B) 값이 0이 아니면 하루 더 가야 (V-A)에 도달한다는 뜻이므로 day에 1을 더해준다.
#include <iostream>
using namespace std;

int main(void) {
	int V, A, B; //높이, 낮+, 밤-
	int day = 0; //소요일

	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; 
}

풀이3

풀이2를 더 간결하게 고쳐봤다.

#include <iostream>
using namespace std;

int main(void) {
	int V, A, B; //높이, 낮+, 밤-
	int day = 0; //소요일
    
	cin >> A >> B >> V;
    
	day=((V - A) % (A - B)) == 0 ? (V-A)/(A-B) : (V-A)/(A-B)+1;
	cout << day + 1; 
}

0개의 댓글