본문 바로가기
백준 문제 풀이 & C++ 공부

백준 2869번 C/C++

by daisy0461 2021. 3. 1.

www.acmicpc.net/problem/2869

 

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

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

www.acmicpc.net

 

이 문제는 생각보다 쉽다고 생각하고 문제에 접근을 하였습니다.

while문 하나로 문제에 있는 모든 예시가 완벽하게 한번에 돌아가서 답이 맞겠구나 싶어서 바로 제출을 했는데

이럴수가.. 시간초과..???

아니 while문 하나만 썼는데 시간초과? 반복문 자체를 쓰면 안되는 문제구나라고 생각하고 다시 생각을 했습니다.

 

그러면서 생각한 방식이 결국 마지막 날에는 a만큼 올라가게 될거고 그 전날에는 a-b만큼 올라가게 될 것이니까

(v-a) / (a-b)를 해보면 어떨까 싶어서 했습니다. 다행히도 접근 방식은 좋았고 잘 돌아갔습니다.

하지만 문제점이 정확하게 딱 떨어질 때에만 사용이 가능하다는 점이었습니다. 그렇지만 이런 규칙을 생각을 해냈다면 큰 문제는 아니었습니다.

그저 하루만 더 넣어주면 되는 문제였습니다.

 

제가 작성한 코드입니다. 

주석 처리되어 있는 while문은 처음에 제가 시도를 하였던 방식입니다.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

//달팽이가 V미터인 나무 막대를 올라간다.
//달팽이는 낮에 A만큼 올라갈 수 있다.
//하지만 자는 동안 B만큼 미끄러진다. 정상으로 간 후에는 미끄러지지 않는다.


int main()
{	
	int v, a, b;
	scanf("%d %d %d", &a, &b, &v);		//올리가는 높이, 미끄러지는 높이, 올라가야하는 높이

	int sum = 0; int dayCount=0;
	//while (1) {
	//	sum = sum + a;
	//	dayCount++;
	//	if (sum >= v) {		//정상으로 갔는지 체크
	//		break;
	//	}
	//	sum = sum - b;
	//}

	if ((v - a) % (a - b) == 0) {
		dayCount = (v - a) / (a - b) +1;		//+1 이유: -a도 하루로 치기 때문에
	}
	else {
		dayCount = (v - a) / (a - b) + 2;		//+2 이유: -a를 하루로 쳐주고 정확하게 떨어지지 않기 때문에 하루를 더해준다.
	}
	printf("%d", dayCount);
}

'백준 문제 풀이 & C++ 공부' 카테고리의 다른 글

백준 7568번 C/C++  (0) 2021.06.21
백준 4553번 C/C++  (0) 2021.06.14
백준 2839번 C/C++  (0) 2021.03.01
백준 2798번 C/C++  (0) 2021.02.27
백준 2275번 C/C++  (0) 2021.02.27