백준 2869 달팽이는 올라가고 싶다(Java)
일단 시간 제한이 상당히 빡세서 스캐너는 탈락
언뜻 보기에는 굉장히 쉬운 문제처럼 보였다.
(올라간 길이 - 내려간 길이) * 일수 >= 총 막대길이
로 생각해서 부등식 풀면 되지 않을까? 이거 중학생도 풀겠네 라고 생각하고
코드짜기전에 예제 1 케이스를 대입해봤는데 바로 안 맞는다.
올라간 길이 = 2
내려간 길이 = 1
총 길이 = 5
라서 일수 = 5 / (2-1) = 5 겠네 라고 생각했는데 웬걸 예제 답에 4라고 떡하니 적혀있네?
정상에 올라간 후에는 미끄러지지 않는다.
라는 전제조건 때문이다.
1일차: 2 up 1 down = 최종위치 1
2일차: 2 up 1 down = 최종위치 2
3일차: 2 up 1 down = 최종위치 3
4일차: 2 up => 여기서 이미 5가 되어 버리고, 여기서 멈춘다.
그렇다면 하루에 내려가는 길이를 고려하지 않기 위해
일수 = (총길이 - 내려간 길이) / (올라간 길이 - 내려간 길이)로 수식을 세우면 어떻게 될까?
(5-1) /(2-1) = 4 로 맞는데, 이게 2-1 이 1이라서 그냥 우연히 맞은건 아닐까?
예제 2로 케이스 하나 더 검증해보자.
올라간 길이 = 5
내려간 길이 = 1
총 길이 = 6
1일차: 5 up 1 down = 최종위치 4
2일차: 5 up ...? => 이미 올라가다 끝 6까지 다 갔네?
(6-1) / (5-1) = 5/4 = 1.25.. 니까
나눴을 때 딱 떨어지지 않으면 하루를 더해주면 되겠다.
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int a = Integer.parseInt(st.nextToken()); //낮에 올라가는
int b = Integer.parseInt(st.nextToken()); //밤에 미끄러지는
int v = Integer.parseInt(st.nextToken()); //총 높이
int day = 0;
day = (v-b) / (a-b);
//0으로 나누어 떨어지지 않는 경우 - 미끄러지고 남은 높이가 낮에 올라가는 높이보다 적을때
if((v-b) % (a-b) != 0){
day ++;
}
System.out.println(day);
}
}
어려운 로직은 없지만, 다 올라가면 바로 멈추는 부분 고려하기가 조금 까다로웠다.
아, 오늘부터 올라가는 글은
https://github.com/gogimandu1019/baekjoonAlgo/
GitHub - gogimandu1019/baekjoonAlgo: 백준 알고리즘 문제풀이 공유
백준 알고리즘 문제풀이 공유. Contribute to gogimandu1019/baekjoonAlgo development by creating an account on GitHub.
github.com
깃허브 알고리즘 폴더를 만들어 거기에도 함께 커밋하려 한다.
깃허브 계정이 있기는 했지만 잘 가꿔진 잔디밭이 없어서 아쉬웠던 적이 최근에 있어서
이전에 올린 풀이들도 간간이 커밋을 해둘 예정이다.
블로그도 내 삶에서의 어떤 아쉬움들을 모아 만들어가고 있는 공간이기도 하다.
여전히 버벅거리는 부분도 있지만,, 아무튼,,