알고리즘/백준
[2869 JAVA] 달팽이는 올라가고 싶다.
절취선
2020. 7. 13. 13:17
반응형
처음 이 문제를 풀면서 다음과 같은 수식을 만들었습니다.
day++;
meter=0;
meter = meter +(A-B);
간단한 수식을 만들어 실행한때 정상적으로 문제의 답이 나왔으나
문제 제출하면 "시간 초과"가 뜨더라고요.
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int A = sc.nextInt();
int B = sc.nextInt();
int V = sc.nextInt();
int meter =0;
int day =0;
while(true) {
day++;
meter= meter+A;
if(meter<V) {
meter= meter-B;
}else {
break;
}
}
System.out.println(day);
}
}
문제는 V의 값이 너무나도 커지면 반복문을 끝없이 반복하게되서 지정된 시간 제한을 넘어버리게 됩니다.
문제점을 보도록 하겠습니다.
1. 답은 day를 구하는 것이지 길이를 구하는 것은 나중이다.
즉 meter = meter +(A-B); 수식을 만들어 적용할 필요가 없다
meter 거리에 B 거리를 보완후 하루동안 이동한 거리(A-B)를 나누어 day를 구하는 방식을 적용했습니다.
최초 한번만 실행하기 때문에 과도한 반복시간은 배제가 가능!
그리고 if문을 적용하여 목적 거리에 도착을 못하면 day+1 을 입력하여 보정해준다.
2. 정수 입력 방식을 바꿔 보자
정수를 입력하는 방법은
Integer.parseInt 방식
Scanner 방식
Tokenizer 방식
각 방식의 목적은 입력이지만 입력 버퍼와 시간의 차이가 있습니다.
저는 방식을 바꾸어 Tokenizer 방식과 Integer.parseInt 방식을 사용했습니다.
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 =(V-B)/(A-B);
if((V-B)%(A-B)!=0) {
day++;
}
System.out.println(day);
}
}
시간초과 의 의미는 이해했으나 처음으로 코딩하면서 코딩과 시간관계의 문제를 해결하기 위해 고민해본 시간이었습니다.
반응형