Java - 알고리즘

백준 JAVA - 3단계 for 활용하기 (1) (feat.Buffer, StringTokenizer, String.split 사용)

TerianP 2021. 9. 29.
728x90

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 문 나머지 문제들도 함께 가져오도록 하겠다.

댓글