백준 2869_달팽이는 올라가고 싶다.cpp

hello_hidi·2021년 7월 4일
0

baekjoon_C++

목록 보기
16/33
post-thumbnail

<소스코드>

#include <iostream>
using namespace std;

int main() {
	long long a, b, v;
	cin >> a >> b >> v;
	long double realday = 0;
	long long day = 0;
	realday = (long double)(v-a)/(a-b) + 1;
	day = (v-a)/(a-b) + 1;
	if(realday == day){
		cout << day << endl;
	}else{
		cout << day+1 << endl;
	}
	
	
	return 0;
}

//배운점 : 시간 짧으면 왠만하면 반복문 쓰지 말기 , long double
  1. 변수
    long long a : 낮에 올라가는 길이
    long long b : 밤에 미끄러지는 길이
    long long v : 나무막대 높이
    long long day : 걸리는 날짜
    long double realday : 정확한 날짜(실수값)
  1. 알고리즘
    1) 처음에는 움직인 값을 식으로 만들어서 day값을 늘려주는 while문을 돌렸는데 시간초과가 나와서 패쓰
while(1){
		move = a + (day-1)*(a-b);
		if(move >= v){
			cout << day << endl;
			return 0;
		}
		day++;
	}

2) 달팽이의 하루 운동량(a-b)을 기준으로 하는 등차수열을 만들었다. 초항은 달팽이가 최고점을 찍는 시간은 언제나 아침이기 때문에 a로 정했다. 그래서 v = a + (day-1)(a-b)라는 식이 나왔고 이것을 day에 관한 식으로 정리해서
day = (v-a)/(a-b) +1로 나왔다.
3) 여기서 문제는 이 값이 소수점 값으로 나오는 경우이다. 그래서 realday라는 변수를 통해 실제 날짜와 비교를 해서 같으면 딱 맞아떨어지는 것임으로 day를 출력하고 아니라면 날짜는 소수일 수 없기 때문에 day+1을 출력해서 완벽해지는 다음날을 출력해주었다.

  1. 배운점
    long double : 실수 범위 큰거 필요할 때 사용하자.
  1. 아쉬운점&느낀점
    시간이 짧으면 왠만하면 공식으로 쓰자
profile
안뇽희디

0개의 댓글