[Java] 백준 2869번 [달팽이는 올라가고 싶다] 자바

: ) YOUNG·2022년 1월 26일
2

알고리즘

목록 보기
46/417
post-thumbnail

백준 2869번
https://www.acmicpc.net/problem/2869


문제

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.


입력

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


생각하기

규칙만 찾는다면 비교적 풀기 쉬운 문제였다.
결국 달팽이가 며칠째에 도착하냐를 묻는 문제이기 때문에

달팽이가 하루에 이동하는 거리의 범위에 목적지까지의 거리가 포함되는지 안되는지 여부를 확인해서 하루를 더하거나 더하지 않으면 된다.

해당 조건은 나머지 값을 통해서 판별 할 수 있다.

먼저 밤에 뒤로 미끄러지는 거리를 생각해서 목적지 값을 다시 설정해준다
destination 변수에 V - B의 거리 값을 저장한다.

여기서 왜 V-B의 값을 뺀 거리를 목표로 하냐면
예를 들어보자 A는 4 B는 1 V는 17 이라고 했을때
달팽이는 낮에 4m를 올라가고 밤에는 1m를 미끄러진다.

이렇게 달팽이가 목표지점에 도달하기 전까지는 하루에 3m의 거리를 이동하게 되는데, 우리가 반복되는 거리 3의 거리를 통해서 거리를 구하기 위해서는 똑같이 목적지에도 1이라는 숫자를 빼줌으로써 반복되는 값으로 목적지 까지의 요일을 구할 수 있다.

쉽게 말하자면 반복되는 낮과 밤의 조건에 맞춰 목적지에도 동등한 조건을 주는 것이다.

destination는 16, dist는 3 의 값을 가지게 된다.

div의 값은 16 / 3 으로 5의 값을 가져서 최소 5일은 걸린다는 것이고
다음 mod값이 0이 아닐 경우 하루를 더 넘겨야 한다는 결론을 내릴 수 있다.

mod값은 16 % 3 으로 나머지 1의 값이 생기므로 하루가 더 필요하다는 것을 알 수 있다.

이렇게 5일 + 1일로 17m 까지는 6일의 기간이 소요된다는 결과 값이 나온다.



TMI

달팽이가 높은 곳을 올라가나?
갑자기 궁금하네



코드

import java.util.*;
import java.io.*;

public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		long A = Long.parseLong(st.nextToken());
		long B = Long.parseLong(st.nextToken());
		long V = Long.parseLong(st.nextToken());

		long destination = V - B;
		long dist = A - B;

		long div = destination / dist;
		long mod = destination % dist;

		long day = div;
		if(mod != 0) {
			day = day + 1;
			System.out.println(day);
		}
		else {
			System.out.println(day);
		}

	}
}

0개의 댓글