[★2][백준15552번]빠른 A+B (JAVA)

Date:     Updated:

카테고리:

태그:

[★2][백준15552번]빠른 A+B (JAVA)

15552번 문제 ☞ https://www.acmicpc.net/problem/15552

난이도 ☞ [★2]

빠른 A+B

  • 문제
    • 본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.
      C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL)sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.
      Java를 사용하고 있다면, ScannerSystem.out.println 대신 BufferedReaderBufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.
      Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.
      또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.
      자세한 설명 및 다른 언어의 경우는 이 글에 설명되어 있다.
      이 블로그 글에서 BOJ의 기타 여러 가지 팁을 볼 수 있다.
    • 첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.
    • 각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.
    • 시간제한
      Java 8: 1.5 초
      Java 8 (OpenJDK): 1.5 초
      
      예제입력 예제출력
      5
      1 1
      12 34
      5 500
      40 60
      1000 1000
      2
      46
      505
      100
      2000

내가 푼 풀이

이번 문제는 for문으로 풀기 전에 이 테스트는 1.5초의 시간제한이 있다. 그 말은 즉슨 1500ms내에 코드 작동이 해결되어야 한다.
이 전 게시글에서 보다시피 Scanner방식을 쓰게 된다면 성능이 BufferedReader보다는 좋지 않기때문에 아마 Scanner를 사용해서 코드를 작성하게 된다면 실패라는 문구가 뜨고 통과가 되지 않을 것이다. 그렇기 때문에 Scanner방식이 아닌 문제에서 보다시피 BufferedReaderBufferedWriter를 사용하여 코드를 작성한다면 충분히 가능할 것이다.

[ 풀이 1 ]

메모리 : 236348KB
시간 : 868ms

BufferedReader, BufferedWriter, StringTokenizer

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

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 t = Integer.parseInt(br.readLine());

		StringTokenizer st;

		for (int i = 0; i < t; i++) {
			st = new StringTokenizer(br.readLine(), " ");       //문자열 분리

			bw.write((Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken())) + "\n");

		}
		br.close();

		bw.flush();
		bw.close();
	}

}

위와 같은 방법으로 readLine()으로 받고, StringTokenizer로 문자열을 분리해주고, 버퍼를 비우고(flush), 닫아줘야 한다.(close)
하지만 이와 같은 방법만 있는 것은 아니다. 이 뿐만 아니라 StringBuilder를 사용하여 StringBuilder에 담아 한번에 출력하는 방법도 있다. 그 코드는 아래와 같다.

[ 풀이 2 ]

메모리 : 221200KB
시간 : 840ms

BufferedReader, StringTokenizer, StringBuilder

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));
		
		int t = Integer.parseInt(br.readLine());

		StringTokenizer st;
		StringBuilder sb = new StringBuilder();

		for (int i = 0; i < t; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			
			sb.append(Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken()));
			sb.append('\n');
		}
		br.close();

		System.out.println(sb);
	}

}

위와 같이도 풀 수 있다. StringBuilder에 한번에 다 저장을 해두고 식이 끝나면 한번에 출력하는 방식이다.

BKJN 카테고리 내 다른 글 보러가기

댓글 남기기