이 문제를 풀면서 다시 한 번 새기고 간 개념 네 가지.
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);
}
}
}
이 문제 풀때는 '손익분기점'에 대해 좀 알아야했던 거 같다. 그리고 입력값의 범위가 크기 때문에 일일이 반복문으로 합계를 구해서 하면 시간초과로 틀린다. 그래서 위와 같은 방법으로 풀었다.
단순한 개념을 이용한 문제인데 흠칫 했던 거 같다. 정신 차려!!!!!!!!!
'알고리즘 문제풀이' 카테고리의 다른 글
백준 알고리즘 2869번 문제풀이(JAVA) (0) | 2021.09.17 |
---|---|
백준 알고리즘 1193번 문제풀이(JAVA) (0) | 2021.09.17 |
백준 알고리즘 2292번 문제풀이(JAVA) (0) | 2021.09.17 |
백준 알고리즘 1316번 문제풀이(JAVA) (0) | 2021.09.17 |
백준 알고리즘 2941번 문제풀이(JAVA) (0) | 2021.09.17 |