자바로 백준 풀 때 맞는 알고리즘을 짜도 시간이 초과하는 경우가 있다.
보통 입력은 Scanner, 출력은 System.out.println()로 작성하지만 이게 좀 느리다..
백준 님이 언어별로 입력속도와 출력속도(링크) 차이를 비교한 글이다. scanner과 sysout은 저 밑에 있는 걸 확인할 수 있다.
시간초과로 틀리는 상황을 없애기 위해 Buffered 사용법을 알아보도록 하자
먼저 느려지는 이유를 대충 알아보자면
Scanner은 입력문자를 space, enter로 구분하고
BufferedReader는 enter로만 구분하고 버퍼공간에 저장해 두었다가 한 번에 내보내서 빠르다.
그래서 한번에 입력받은 값을 나눠줘야 해서 코드가 길어지는 단점이 있다..
이제 사용방법에 대해 알아보자
import java.io.BufferedReader;
import java.io.BufferedWriter;
기본 임포트 형식이다.
public static void main(String[] args) throws IOException {
}
메인함수에 예외발생 처리!!!! 이거 안하면 try catch문 써야 한다 꼭 사용해 주자
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String str = br.readLine(); //한줄에 입력받기
bw.write(str); //str값 출력
bw.flush(); //남은값 모두 출력면서 비우기
선언, 입력과 출력을 하는 기본 형식인데 이대로 출력하면 한 문장을 그대로 받아들여서
StringTokenizer 클래스를 이용해 공백을 이용해 문자를 분리해줘야 한다.
사용법은 실전을 통해 알아보자.
예제 1) https://www.acmicpc.net/problem/11021
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine()); //맨처음 들어온값 5를 int로 바꾸며 저장
for (int i = 1; i <= n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine()); //한줄에 들어온 문자열을 나눈다
int one = Integer.parseInt(st.nextToken()); //처음 들어온 숫자를 저장한다
int two = Integer.parseInt(st.nextToken()); //두번째로 들어온 숫자를 저장한다
bw.write(String.valueOf(one)+" "); //첫번째 int값을 String으로 변환하면서 출력
bw.write(String.valueOf(two)+"\n"); //두번째 int값을 String으로 변환하면서 줄바꿈
}
bw.flush();
}
입력받은걸 그대로 출력하는 코드를 만들어 보았다.
br.readLine()은 한 줄 들어온 값을 뜻하고
Integer.parseInt는 String값을 int로 바꿔주는 것이다.
for문으로 들어가 다시 다음줄을 읽고 "1 1" 값이 들어왔으니 StringTokenizer로 "1", "1"로 나눠준 뒤에
next.Token()을 이용해 각각 변숫값에 저장해 두었다.
write는 String값으로밖에 출력이 안 돼서 String.valueOf() 문으로 변환해주어야 한다.
추가로 위에선 "\n"을 이용해 줄 바꿈 해주었는데
bw.newLine()을 이용해 줄 바꿈이 가능하다!!
코드를 이해했다면 코드를 조금 수정해서 문제를 맞혀보자.
(문제풀이)
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine()); //5 입력 받음
for (int i = 1; i <= n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int one = Integer.parseInt(st.nextToken());
int two = Integer.parseInt(st.nextToken());
bw.write("Case #"+String.valueOf(i)+": ");
bw.write(String.valueOf(one+two)+"\n");
}
bw.flush();
}
}
예제 2) https://www.acmicpc.net/problem/4344
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine()); //5를 입력받는다
for (int i = 0; i < n; i++) { //5번 반복
StringTokenizer st = new StringTokenizer(br.readLine()); //한줄에 들어온 문자열을 나눈다
int s = Integer.parseInt(st.nextToken()); //맨앞 숫자를 int로 받는다
for (int j = 0; j < s; j++) { //s번 반복
int data = Integer.parseInt(st.nextToken()); //뒤에 들어온 값을 data에 저장한다
bw.write(String.valueOf(data)); //data값 출력
}
bw.newLine(); //줄바꿈
}
bw.flush();
}
이것 역시 입력받는 것과 출력만 먼저 해보았다. 내친김에 이것도 한번 풀어보자
(문제풀이)
package baekjoon;
import java.io.*;
import java.util.StringTokenizer;
public class numcard {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int [] arr;
int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
arr = new int[s];
int sum=0;
for (int j = 0; j < s; j++) {
int data = Integer.parseInt(st.nextToken());
arr[j]=data;
sum+=data;
}
double up=(sum/s);
double count=0;
for(int j=0;j<s;j++){
if(arr[j]>up){
count++;
}
}
String format = String.format("%.3f",count/s*100);
bw.write(format+"%");
bw.newLine();
}
bw.flush();
}
}
'Java' 카테고리의 다른 글
자바 Collection Framework , 자료구조 정리 (2) | 2023.02.05 |
---|