View

https://www.acmicpc.net/problem/15552

 

15552번: 빠른 A+B

첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

www.acmicpc.net

📚 문제

각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.

 

📝 문제 해결

 본격적으로 반복문을 사용하기 앞서 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다. 따라서 Scanner와 System.out.println 대신 BufferedReaderBufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.

 

 BufferedReader/BufferedWriter는 Buffer에 있는 IO 클래스이다. 입력된 데이터가 바로 전달되지 않고 중간에 버퍼링 된 후에 전달된다. 출력도 마찬가지로 버퍼를 거쳐서 간접적으로 출력장치에 전달되기에 시스템의 데이터처리 효율성을 높여준다. 하지만 Space,Enter를 모두 경계로 인식하는 Scanner와 달리 BufferedReader는 Enter만 경계로 인식하고 받은 데이터가 String으로 고정되기때문에 입력받은 데이터를 가공하는 작업이 필요하다.

 

  • 버퍼 (buffer) : 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 임시 메모리 영역으로 입출력 속도가 향상된다.
  • 버퍼 플러시 (buffer flush) : 버퍼에 남아있는 데이터를 출력시킴 (버퍼를 비우는 동작)

* BufferedReader 사용법

  • BufferedReader(Reader rd) : rd에 연결되는 문자입력 버퍼스트림 생성

 입력은 readLine()이라는 메서드를 사용하는데 readLine()의 리턴값은 String으로 고정되기때문에 다른 타입으로 입력을 받으려면 형변환을 꼭 해줘야한다.

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
String s = bf.readLine(); //String
int i = Integer.parseInt(bf.readLine()); //Int

 

 read한 데이터는 라인단위로만 나눠지기때문에 공백단위로 데이터를 가공하려면 작업이 필요하다.

StringTokenizer st = new StringTokenizer(s); //StringTokenizer인자값에 입력 문자열 넣음
int a = Integer.parseInt(st.nextToken()); //첫번째 호출
int b = Integer.parseInt(st.nextToken()); //두번째 호출

String array[] = s.split(" "); //공백마다 데이터 끊어서 배열에 넣음
  • StringTokenizer에 nextToken()함수를 활용하면 readLine()을 통해 입력받은 값을 공백단위로 구분하여 순서대로 호출할 수 있다.
  • String.split()함수를 활용하여 배열에 공백단위로 끊어서 데이터를 넣고 사용할 수 있다.

 

package part1;

import java.util.Scanner;
import java.util.StringTokenizer;

public class BaekJoon {
    public static void main(String args[]) {
        Scanner sc=new Scanner(System.in);
        String input=sc.nextLine();
        
        StringTokenizer st=new StringTokenizer(input," ");
        
        System.out.println(st.countTokens());
    }
}
countTokens() : StringTokenizer의 남아있는 토큰 갯수를 반환
 

* BufferedWriter 사용법

  •  BufferedWriter(Writer wt) : wt에 연결되는 문자출력 버퍼스트림 생성

BufferedWriter의 경우 버퍼를 잡아놓았기 때문에 반드시 flush() / close()를 호출해줘야한다.

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));//선언
String s = "abcdefg";//출력할 문자열
bw.write(s+"\n");//출력
bw.flush();//남아있는 데이터를 모두 출력시킴
bw.close();//스트림을 닫음

 

💻 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

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().trim());
        
        for (int i=0; i < n; i++) {
            String text = br.readLine();
            String[] word = text.split(" ");
            int a = Integer.parseInt(word[0]);
            int b = Integer.parseInt(word[1]);
            bw.write((a+b) + "\n");
        }
        
        bw.flush();
        bw.close();
    }
}
 
import java.io.*;
import java.util.*;

public class Main{
    public static void main(String args[]) throws Exception{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
        int num=Integer.parseInt(br.readLine());
        
        for(int i=0;i<num;i++){
            StringTokenizer st=new StringTokenizer(br.readLine());
            int a=Integer.parseInt(st.nextToken());
            int b=Integer.parseInt(st.nextToken());
            bw.write(a+b+"\n");
        }
        bw.flush();
    }
}
728x90
Share Link
reply
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31