2021.09.26 - [JAVA] - Java 입출력(I/O), 스트림(Stream), 버퍼(Buffer) 개념 및 사용법
백준 for 문 문제중에서 15552번 문제는 Buffer를 사용하여 푸는 문제입니다. 혹시나 해당 부분에 대해서 잘 모르는 경우 제가 열심히 정리한 글 한번만 읽어주시면 감사하겠습니다!
여기서는 백준 for 문제 2739 ~ 2741 까지! 이 중 Buffer 를 처음 사용해본 15552 문제부터는 전부 Buffer 를 활용하여 문제를 풀었다.
1. 아래는 2739, 10590, 8393 문제들에 대한 코드로 사실상 for 문을 사용하는데 있어 기초적인 문제들
import java.util.Scanner;
public class Q10 {
public static void main(String[] args) {
Q_2739();
Q_10590();
Q_8393();
}
static void Q_2739() { // 구구단 계산하기
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
for(int i=1; i<=9; i++) {
System.out.printf("%d * %d = %d \n",n,i,n*i);
}
}
static void Q_10590() { // 주어지는 테스트 케이스에 맞춰 A+B 출력하기
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int result = 0;
for(int i=1; i<=n; i++) {
int a = scan.nextInt();
int b = scan.nextInt();
if(0<a && 0<b) {
result = a+b;
System.out.println(result);
}
}
}
static void Q_8393() { // 1부터 주어지는 값까지 더하기
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int i=0;
int result = 0;
if(1<=n && n<=10000) {
for(i=1; i<=n; i++) {
result+=i;
}
System.out.println(result);
}
}
}
2. 15552 문제 : Buffer 사용 및 StringTokenizer, String.split() 사용
이 문제는 개인적으로 매우매우 중요하다고 생각한다. 처음 Buffer 를 사용해보기도 했고, 이 문제들 때문에 따로 Buffer 와 스트림과 드등에 대한 긴 정리글을 작성했을 정도니...물론 그렇게 한번에 정리해놓은 덕에 보다 쉽게 다른 문제들도 Buffer 로 접근할 수 있었다는 장점 아닌 장점이 있었다.
import java.io.*; // 귀찮아서 그냥 io 와 관련된 모든 라이브러리를 임포트했다.
import java.util.StringTokenizer;
public class Q10_buffer {
public static void main(String[] args) throws IOException {
// Q_15552 에 대한 2가지 풀이 방법
solution_1();
solution_2();
Q_2741();
Q_2742();
}
static void solution_1() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine());
// Buffer 로 받은 문자열 자르는 방법 1
// split() 메소드 사용
// String[] result = "문자열".split("정규표현식");
for(int i=1; i<=T; i++) {
String str = br.readLine();
String[] result = str.split(" ");
int num1 = Integer.parseInt(result[0]);
int num2 = Integer.parseInt(result[1]);
bw.write(num1+num2+"\n");
}
br.close();
bw.flush();
bw.close();
}
static void solution_2() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine());
// Buffer 로 받은 문자열 자르는 방법 2
// StringTokenizer 사용 , import java.util.StringTokenizer 필수
// StringToeknizer st = new StringTokenizer("문자열", "구분자");
for(int i=1; i<=T; i++) {
String str = br.readLine();
StringTokenizer st = new StringTokenizer(str, " ");
int num1 = Integer.parseInt(st.nextToken());
int num2 = Integer.parseInt(st.nextToken());
bw.write(num1+num2+"\n");
}
br.close();
bw.flush();
bw.close();
}
- BufferReader 로 받은 문자열을 빈칸을 기준으로 나누고, int 형으로 형변환하여 결과를 도출해냈다. 이때 문자열을 나누는 방법이 총 2가지가 있다는 것을 알았다.
1) split() 메소드 사용 : 첫번째는 split() 메소드를 사용하는 방법으로 입력받은 문자열을 특정한 값(여기서는 빈칸)을 기준으로 배열로 만들어 값을 저장한다. 이후 배열에서 하나씩 값을 빼오면서 int 형으로 형변환 후 두 개의 값을 더하면 끝!! 기본식은 아래와 같다.
String[] "변수명" = "입력받은 문자열 변수명".split("정규표현식")
String str = br.readLine();
String[] result = str.split(" ");
int num1 = Integer.parseInt(result[0]);
int num2 = Integer.parseInt(result[1]);
2) StringTokenizer 사용 : 두번째는 StringTokenizer 를 사용하는 방법으로, 위에 방법보다 이 방법이 더 많이 쓰는 듯하다. 먼저 StringTokenizer를 임포트 후 객체를 생성한다. 이때 StringTokenizer 객체 생성 시 첫 번째 파라미터로 전체 문자열을 받고, 두 번째 파라미터는 구분자를 받는데 만약 구분자가 생략되면 기본적으로 space(공백) 이 된다.
이후 nextToken() 메소드를 사용해 하나씩 값을 가져와서 형변환 후 두 개의 값을 더하면 끝!
기본식은 아래와 같다.
StringTokenizer "객체생성" = new StringTokenizer("입력받은 문자열 변수명", "구분자");
StringTokenizer st = new StringTokenizer(str, " ");
아래는 StringTokenizer 에서 사용되는 메소드이다.
메소드 | 설명 | |
int | countTokes() | 꺼내지 않고 남아있는 토큰 수 |
boolean | hasMoreTokens() | 남아 있는 토큰이 있는지 여부 |
String | nextToken() | 토큰을 하나씩 꺼내옴 : 말 그대로 순서대로 하나씩 꺼내와서 저장됨 |
3. 2741, 2742 : N까지 순서대로 출력하기, N부터 거꾸로 출력하기
전에 사용되었던 Buffer 활용을 위해서 내는 문제라고 생각된다ㅋㅋㅋ아주 간단한 문제로 BufferedReader 로 값을 입력받고, for를 사용해 출력해주면 된다.
버퍼 사용에 있어서 close() 와 flush() 만 주의하자!
package baekJoon;
import java.io.*;
import java.util.StringTokenizer;
public class Q10_buffer {
public static void main(String[] args) throws IOException {
Q_2741();
Q_2742();
}
static void Q_2741() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
for(int i=1; i<=N; i++) { // 여기는 1부터 순서대로
bw.write(i+"\n");
}
br.close();
bw.flush();
bw.close();
}
static void Q_2742() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
for(int i=N; i>=1; i--) { // 여기는 거꾸로 1까지
bw.write(i+"\n");
}
br.close();
bw.flush();
bw.close();
}
}
사실 원래는 for 문 문제 다 풀고 글을 작성하려했는데, 15552 문제에 대한 것을 써야할 듯하여 일부분만 짤라서 글을 작성하였다.
다음에는 for 문 나머지 문제들도 함께 가져오도록 하겠다.
'Java - 알고리즘' 카테고리의 다른 글
백준 Java - 4단계 1차원 배열 활용하기(2) : 3052번, 1546번 (0) | 2021.10.20 |
---|---|
백준 JAVA - 4단계 1차원 배열 활용하기(1) (0) | 2021.10.15 |
백준 JAVA - 3단계 for 활용하기 (2) (feat. 별 찍기, x보다 작은 수) (0) | 2021.10.08 |
백준 JAVA - 2단계 If 문 활용하기 (0) | 2021.09.14 |
백준 Java - 1단계 입출력과 사칙연산 (0) | 2021.09.06 |
댓글