이 문제를 풀면서 다시 한 번 새기고 간 개념 네 가지.

 

int의 범위는  -21억~21억까지이다.

제한 시간이 1초 미만이고 숫자가 크다면 반복문으로 해결할 수 없다.

BufferedReader의 개념

StringTokenizer의 사용

 

BufferedReader는 버퍼를 이용하는 대표적인 i/o 클래스이다.

스페이스와 엔터 둘 다 경계값으로 인식하는 Scanner와 다르게 엔터만을 경계값으로 인식한다.

또한 버퍼가 가득 차거나 엔터값이 들어왔을 때까지 입력값을 버퍼에 저장해뒀다 한 번에 전송한다. 입력값이 많이 않을 때는 Scanner와 속도 차이가 별로 없지만 값이 많아질수록 속도, 성능 면에서 BufferedReader가 훨씬 효율적이다.

 

BufferedReader로 입력받을 때 한 줄로 입력받고 공백으로 값을 구분할 때 StringTokenizer를 이용하는 것이 좋다. 단지 공백만을 없애고 값을 바로바로 인식하기 때문에 내부적으로 복잡한 split보다 훨씬 속도가 빠르다. (물론 구분자 설정을 아무것도 안해주었을 때 공백을 구분자로 인식한다는 말이다.) split은 인덱스로 접근해야 될 때 사용하면 훨씬 효율적이다.

 


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;


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 fix = Integer.parseInt(st.nextToken());
int variable = Integer.parseInt(st.nextToken());
int price = Integer.parseInt(st.nextToken());


if(price <= variable) {
System.out.println("-1");
}else {
System.out.println(fix/(price - variable) + 1);
}

}


}


 이 문제 풀때는 '손익분기점'에 대해 좀 알아야했던 거 같다. 그리고 입력값의 범위가 크기 때문에 일일이 반복문으로 합계를 구해서 하면 시간초과로 틀린다. 그래서 위와 같은 방법으로 풀었다.

 단순한 개념을 이용한 문제인데 흠칫 했던 거 같다. 정신 차려!!!!!!!!!

+ Recent posts