반응형
문제
https://www.acmicpc.net/problem/2869
코드
#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
설명이 매우 깔끔하다.
반응형
'Problem Solving > 백준' 카테고리의 다른 글
[백준|파이썬] 2606: 바이러스 (실버3) (0) | 2023.04.05 |
---|---|
[백준|파이썬] 1260: DFS와 BFS (실버2) (0) | 2023.04.05 |
[백준|C++] 2750: 수 정렬하기 (0) | 2021.09.10 |
[백준|C++] 10250: ACM 호텔 (1) | 2021.09.01 |
[백준|C++] 2292: 벌집 (0) | 2021.09.01 |
[백준|C++] 1712: 손익분기점 (0) | 2021.08.31 |