이번에도 일어난 상황에 대해서 추론을 하여 적합한 답을 출력하는 문제다.
가야하는 거리가 주어지고, 시작속도를 1m/s로 시작해서 특정거리를 도달할때 다시 속도가 1m/s이여야 한다.
선택하여 속도를 1씩 늘리거나, 유지하거나, 1씩줄일수 있다. 가야하는 거리까지 가는데 가장 최단시간을 구해야한다.
오늘 뭔가 문제가 잘풀린다.. 나는 추론에 강한가,,, 후후후후,,,,
Xm 만큼 달리기를 진행하려 합니다. 1m/s로 시작하되, 1초에 한 번씩 속도를 유지할 것인지, 1m/s 만큼 증가시킬 것인지, 1m/s 만큼 감소시킬 것인지를 결정할 수 있습니다. 단, 도착지에 도달하는 순간의 속력은 꼭 1m/s가 되어야만 합니다. 가능한 최단 시간을 구하는 프로그램을 작성해보세요. 단, 이동하는 도중 0m/s가 되어서는 안됩니다.
입력 형식
첫 번째 줄에 X가 주어집니다.
- 1 ≤ X ≤ 10,000
출력 형식
첫 번째 줄에 가능한 최단 시간을 출력합니다.
입출력 예제
예제1
입력:
10
출력:
6
예제 설명
다음과 같이 이동하면 6초 후에 1m/s 속도로 도착지(10m)에 도달하게 됩니다.
0~1초 1~2초 2~3초 3~4초 4~5초 5~6초
속력 1m/s 2m/s 3m/s 2m/s 1m/s 1m/s
거리 1m 3m 6m 8m 9m 10m
내 코드
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
//속도를 올렸을때, 남은거리가 (속도) + (속도-1) + ... + 1보다 크다면 올려도 된다,
//속도를 유지했을때, 남은거리가 (속도) + (속도-1) + ... + 1보다 크다면 유지해도 된다,
//위 두 상황이 아니라면 속도를 감소해야한다.
//초깃값
int distance = 1;
int speed = 1;
int time = 1;
int ret = 0;
while(true){
if(getDescSum(speed+1) <= x-distance){ //속도를 올려도 남은거리를 정확하게 완주할 수 있다면, 속도를 올린다
speed++;
}else if(getDescSum(speed) <= x-distance){ //속도를 유지해서 남은거리를 정확하게 완주할 수 있다면, 속도를 유지한다
//do nothing
}else{ //속도를 줄여야만 남은거리를 정확하게 완주할 수 있으므로, 속도를 줄인다.
speed--;
}
time++;
distance += speed;
if(distance == x){
ret = time;
break;
}
}
System.out.print(ret);
}
static int getDescSum(int num){
if(num == 1){
return num;
}else{
return num + getDescSum(num-1);
}
}
}
'코딩테스트 > 문제풀이' 카테고리의 다른 글
[코드트리] 세 수의 최대 곱 (0) | 2023.05.14 |
---|---|
[코드트리] ABC 줄 세우기 (1) | 2023.05.12 |
[코드트리] 코딩톡 (0) | 2023.05.09 |
[코드트리] 구간 잘 나누기 (0) | 2023.05.08 |
[코드트리] 스승의 은혜3 (1) | 2023.05.04 |