본문 바로가기
Problem Solving/백준

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

by 청량리 물냉면 2021. 9. 2.
반응형
문제

https://www.acmicpc.net/problem/2869

 

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

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

www.acmicpc.net

 

코드
#include<iostream>
using namespace std;

int main() {
	int A;	//올라가는 높이
	int B;	//내려가는 높이
	int V;	//막대기 높이
	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;

	return 0;
}

 

코드 설명

주의점

시간제한 있음. 반복문 사용 불가.

정상에 올라간 후에는 미끄러지지 않는다.

 

(V - A) / (A - B)

V - A

전체 높이에서 올라간 높이를 뺀 값.

 

A - B

올라간 높이 - 내려간 높이. 즉, 하루에 올라간 높이

 

(V - A) / (A - B)

달팽이가 V - A까지 오르는 데 걸리는 날짜. 해당 값이 나누어 떨어진다면, 달팽이는 하루 뒤에 A만큼 올라 꼭대기에 도달한다.

 

if ((V - A) % (A - B) == 0)
	day = (V - A) / (A - B);

(V - A) / (A - B)이 나누어 떨어진다면, 달팽이는 현재 V - A 위치에 있다는 뜻. 달팽이는 하루 뒤 낮에 A만큼 올라 꼭대기에 도달한다.

 

cout << ++day;

다음 날, 꼭대기에 도달 (다음 날이므로 하루 더해줌)

 

else
	day = (V - A) / (A - B) + 1;

(V - A) / (A - B)이 나누어 떨어지지 않는다면, 달팽이는 현재 V - A 위치보다 아래에 있다. 따라서 하루 뒤에 +A 더 올라도 정상에 도달하지 못함. 따라서 하루 더 등락을 반복한다는 의미로 +1을 더해준다.

 

cout << ++day;

이튿 날 꼭대기에 도달

 

 

 

마무리

진짜 어렵다. 
처음에 V / (A - B) 에 엄청 매달리다가 도저히 안 풀려서 구글신을 영접하니 나머지 연산과 (V - A) / (A - B) 공식을 알려준다... 이런 문제를 참고자료 없이 자기 머리에서 바로 꺼내 푸는 사람들 정말 존경스럽다. 
어쨌든 옳다쿠나 하고 혼자 문제 풀어보았다. 근데 혼자 하니까 또 안 풀린다^^ 그러다 어찌어찌 정답은 맞췄는데 이제는 코드가 이해가 안 가고...ㅋㅋ 그러던 중 이 블로그 만나고 광명을 찾았다.

https://sedangdang.tistory.com/7

 

[C] 백준 | 2869번 코드 - *달팽이는 올라가고 싶다

>문제 땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다. 달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간

sedangdang.tistory.com

설명이 매우 깔끔하다.

 

반응형