이번 문제는 달팽이가 하루 동안 올라가고 미끄러지고를 반복하여 원하는 높이의 나무 막대기의 꼭대기에 이르는데까지 걸리는 시간을 구하는 문제였습니다.특이점으로는 낮에는 오르고 밤에는 미끄러지면 정상에 도달한 후에는 미끄러지지 않는다는 점과 시간 제한이 0.15초인 점이었습니다.
Step 0. 해답 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Raise_Snail {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int up = Integer.parseInt(st.nextToken());
int down = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int move = up - down; //실질적인 하루 이동 거리(올라간 거리 - 내려간 거리)
int safe_m = m - up; //up+down이 무조건 일어나는 날들의 마지노선을 구해줄 때 사용
if(safe_m == 0) {
System.out.println(1);
return;
}
int day = safe_m / move;
if (day * move + up >= m) {
System.out.println(day + 1);
} else{
System.out.println(day + 2);
}
}
}
문제를 보니 시간 제한의 추가 시간 없음이 보였고 시간이 빡빡한걸로 보아 뭔가 수식을 원하는거 같았지만 우선 for문으로 풀어봤습니다. 역시나 시간 초과가 나왔고 이렇게 시간 초과 때문에 정답 비율이 20프로대였지 않나 싶습니다.
Step 1. 문제 접근
Step 2. 문제 풀이
int up = Integer.parseInt(st.nextToken());
int down = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
여기서 시간 제한 때문에 BufferReader를 사용했고 StringTokenizer를 띄어쓰기로 구분하여 받은 후 nextToken으로 불러왔습니다. 이때 String 타입으로 받기 때문에 int형으로 형변환을 시켰습니다.
int move = up - down; //실질적인 하루 이동 거리(올라간 거리 - 내려간 거리)
int safe_m = m - up; //up+down이 무조건 일어나는 날들의 마지노선을 구해줄 때 사용
if(safe_m == 0) {
System.out.println(1);
return;
}
safe_m == 0은 목표 높이 - 올라가는 높이가 0이 되는, 즉 올라가자마자 목표에 도달하는 경우입니다. 예를 들면 7, 4, 7 같이 첫 날 7미터를 올라가면 바로 목표를 달성하는 경우입니다. 이럴 경우는 바로 1을 프린트 한 후 메서드를 종료하였습니다.
int day = safe_m / move;
if (day * move + up >= m) {
System.out.println(day + 1);
} else{
System.out.println(day + 2);
}
마지막엔 수식으로 다음날 도착인지 이틀 후 도착인지를 구해줬습니다.
느낀 점
Scanner이외의 입출력 수단도 사용해 보았고 처리 속도라는 관점에서도 문제에 접근해볼 수 있었던 좋은 문제였습니다. 다른 분들은 수식을 한 줄로 끝내는 경우도 있던데 앞으로 더욱 공부를 하여 저도 좀 더 간결한 수식을 만들어내는 능력을 향상시켜야겠다고 생각했습니다.
출처 : 백준 2869번 https://www.acmicpc.net/problem/2869
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
}
이렇게 했더니 틀린답이라고 하네용,,,
그리고 day = safe / move -> day move + up = target 이라서
day move = target일 때는 안구하는건가욤??
무엇이 잘못된건지 모르겠습니다 ㅠㅠ