본문 바로가기

개발 이야기/알고리즘

[백준] 15552번 빠른 A+B

문제링크: https://www.acmicpc.net/problem/15552

풀이출처/ 소스코드 출처: https://whereisusb.tistory.com/270?category=746475

BufferReader와 Writer 출처: https://coding-factory.tistory.com/251

StringTokenizer 출처: https://hunit.tistory.com/166

 

 

풀이1( 내가 작성)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.io.*;
import java.util.StringTokenizer;
 
public class Ex15553 {
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        for(int i=0;i<n;i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            bw.write(Integer.parseInt(st.nextToken())+Integer.parseInt(st.nextToken())+"\n");
        }
        bw.close();
    }
}
 
풀이2 (상단 출처를 밝힌 포스팅에서 발췌)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Ex15553 {
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<n;i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            sb.append(Integer.parseInt(st.nextToken())+Integer.parseInt(st.nextToken())+"\n");
        }
        System.out.println(sb);
    }
}

 

 

- 문제는 쉬운데, 자꾸 시간 초과 발생 + 맨날 Scanner 그만 쓰고 BufferedReader 써야지 다짐만 했던 지난날을 반성하며 포스팅

 

* JAVA에서는 Scaaner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용 할 수 있다.

일명 버퍼류라 불리는 이것들이, 더 수행 속도가 빠르다.

 

 

1. BufferedReader

1) BufferedReader 선언하기

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

 

 - .readLine(); : 입력 할 때 사용하는 메서드

 - String으로 리턴 되기 때문에, 다른 타이브로 입력 받으려면, 꼭 형변환을 해준다.

 - try~catch 문을 사용한 예외 처리를 꼭 해준다. ( readLine을 할 때마다 예외처리를 해줌, 대부분 throw IOEException )

 

2) 데이터 가공하기: Read한 데이터는 라인 단위로만 나눠진다. 공백단위 데이터 가공하려면 따로 split 해주어야 한다. 혹은 StringTokenizer 사용한다.

1
2
3
4
5
StringTokenizer st = new StringTokenizer(s);
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
 
String array[] = s.split(" ");

 

 - s.split("구분자");  : 자바에서 지원하는 String의 기본 메서드 중 하나. '구분자''를 기준으로 문자열을 파싱. 위의 소스코드 대로하면, 문자열 s의 공백 기준으로 파싱되어 배열 array에 예쁘게 순차적으로 저장 될 것이다.

 - StringTokenizer 는 하단에 따로 설명.. 왜냐면 내가 잘 안쓰는 것이기 떄문에...기록이 필요하다 ^_ㅠ

 

 

2. BufferedWriter

1) BufferedWriter 사용법

1
2
3
4
5
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));//선언
String s = "String for print";
bw.write(s+"\n"); // 문자열 s를 출력한다.
bw.flush(); // 남아있는 데이터를 모두 출력한다.
bw.close();// sc.close()와 유사

 - BufferedWriter는 이름 처럼 버퍼를 잡아놓은 것 > 따라서, flush(), close()를 반드시 호출해 수행작업을 완료시켜야 함

 - bw.write() : 자동개행이 없음. 개행 필요 할 경우 +"\n" 해준다.

 

 

3. StringTokenizer

 - String 클래스의 메소드인 split은 파싱한 문자를 배열로 저장

 - StringToknizer는 메소드가 아닌 java.util에 포함되어 있는 자체 클래스

 - 문자열을 '토큰'이라고 일컫는다.

 > 따라서, split과 사용하는 방법이 다르고, StringToknizer 내부에 꼭 넣어야 하는 메소드가 존재

 

1
2
3
4
StringTokenizer st = new StringTokenizer(s); 
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
 

 리턴타입

메소드 

기능 

int

countTokens 

 마지막으로 토큰을 읽어오기 전 남아있는 토큰의 수 

boolean

hasMoreTokens 

 토큰 남아있으면 True, 없으면 False 

String 

nextToken

 토큰 읽어오기

 

 

4. StringBuilder...

점점 길어지는 포스팅... 

+ 문자열에 관한.. 종류가 이렇게 많았던가? 이분이 참 잘 정리해주셨다. 공부할 때 참고하자!

https://jeong-pro.tistory.com/85

'개발 이야기 > 알고리즘' 카테고리의 다른 글

[코딩인터뷰] 1. big-O  (0) 2019.09.17