Java 코딩테스트 준비 (기본)

BrokenFinger98·2024년 7월 9일
0

Problem Solving

목록 보기
6/29

입력

import java.io.*;
import java.util.*;

Scanner scan = new Scanner(System.in);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String input = scan.next(); // 공백 전까지 입력 받음
input = scan.nextLine(); // Enter 치기 전까지 입력 받음
input = br.readLine(); //
String[] input1 = br.readLine().split(" ");
int i = br.read(); // 공백 전까지 숫자 입력 받음
br.close(); // 입력 스트림 아예 닫힘

Scanner이나 System.in.read를 사용하는 것이 일반적이나, 코딩테스트용으로 빠르게 입력받기 위해서는 BufferedReader을 사용합니다.

StringTokenizer 클래스란?

//1. 띄어쓰기 기준으로 문자열을 분리
StringTokenizer st1 = new StringTokenizer(br.readLine());

//2. 구분자를 기준으로 문자열을 분리
StringTokenizer st2 = new StringTokenizer(br.readLine(), " ");

/* 3. 구분자를 기준으로 문자열을 분리할 때 구분자도 토큰으로 넣는다. (true)
* 구분자를 분리된 문자열 토큰에 포함 시키지 않는다. (false)
* (디폴트 : false)
*/
StringTokenizer st3 = new StringTokenizer(br.readLine() , " " , false);

StringTokenizer 클래스는 문자열을 구분자를 이용하여 분리할 때 사용할 수 있습니다.

만일 BufferedReader 클래스의 메서드로 입력을 읽어들인다면 라인 단위로 읽어들일 수 밖에 없습니다.

꼭 BufferedReader 클래스만이 아니더라도, 스페이스 기준으로 혹은 컴마로 혹은 공백을 기준으로 문자열들을 분리한다던가, 특정 문자에 따라 문자열을 나누고 싶을 때 StringTokenizer를 사용합니다.

간단하게
String : 문자열을
Tokenizer : 토큰화한다.
이렇게 해석할 수 있습니다.

즉, 토큰은 분리된 문자열 조각으로, StringTokenizer 클래스는 하나의 문자열을 여러 개의 토큰으로 분리하는 클래스입니다.

StringTokenizer은 공백이 있는 경우 문자열이 공백처리를 땡겨 채우도록 하여 BufferedReader보다 더 빠르다고 합니다.
BufferedReader, InputStreamReader은 java.io에 속하고 StringTokenizer은 java.util에 속합니다.

StringTokenizer 메소드

StringTokenizer st4 = new StringTokenizer(br.readLine());
int count = st4.countTokens();
while (st4.hasMoreTokens()){
	System.out.println(st4.nextToken());
}

hasMoreTokens(), 남아있는 토큰이 있다면 true, 없다면 false를 리턴합니다.
nextToken(), 객체에서 다음 토큰을 반환합니다.
nextToken(String delim), delim 기준으로 다음 토큰을 반환합니다.
hasMoreElements(), hasMoreTokens와 동일한데 엘리먼트보다 토큰으로 된 메서드를 주로 사용합니다.
nextElements(), nextToken 메서드와 동일하지만 문자열이 아닌 객체를 리턴합니다.
countTokens(), 총 토큰의 개수를 리턴합니다.

구분자가 하나가 아닌 여러 문자라면?

String str = "블로그 >개발 블로그 :velog.io/@brokenfinger/posts";
StringTokenizer st5 = new StringTokenizer(str, ">:" );
while (st5.hasMoreTokens()) {
	System.out.println(st5.nextToken());
}
/*
블로그
개발 블로그
velog.io/@brokenfinger/posts
*/

"블로그 >개발 블로그 :velog.io/@brokenfinger/posts" 의 문자열이 있을 때,
1. 블로그
2. 개발 블로그
3. velog.io/@brokenfinger/posts
총 3개의 토근이 생성됩니다.

출력

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String str = "adc"; // 출력 문자열
bw.write(str);
bw.newLine(); // 줄바꿈
bw.flush(); // 남은 데이터 모두 출력
bw.close(); // 출력 스트림 아예 닫힘

StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b").append("\n");
System.out.println(sb);

System.out.println()이 일반적인 방법이나, StringBuilder을 활용해서 출력을 할 수도 있고 BufferedWriter을 활용해서 출력을 할 수도 있습니다.

n행 m열짜리 배열을 입력받고 출력하는 방법

첫번째

import java.io.*;
import java.util.*;

public class Solution {
    static int[][] arr = new int[301][301];
    public static void main(String[] args) throws IOException{
    
        /* 입력 예시
        3 3
        1 2 3
        4 5 6
        7 8 9
         */
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stk = new StringTokenizer(br.readLine()," ");

        int n = Integer.parseInt(stk.nextToken());
        int m = Integer.parseInt(stk.nextToken());

        for(int i=0; i<n; i++){
            stk = new StringTokenizer(br.readLine(), " ");
            for(int j=0; j<m; j++){
                arr[i][j] = Integer.parseInt(stk.nextToken());
            }
        }
        
        /* 출력 예시
        3 3
        1 2 3
        4 5 6
        7 8 9
         */
        
        StringBuilder sb = new StringBuilder();
        for (int i=0; i<n; i++){
            for (int j=0; j<m; j++){
                sb.append(arr[i][j]);
                sb.append(" ");
            }
            sb.append('\n');
        }
        System.out.println(sb);
    }
}

두번째

  //2
  BufferedReader br = new BufferedReader(new InputStreamReadr(System.in));
  String [] input = br.readLine().split(" ");
  n = Integer.parseInt(input[0]);
  m = Integer.parseInt(input[1]);
  
  for(int i=0; i<n; i++){
  	String input2 = br.readLine().split(" ");
    for(int j=0; j<m; j++){
    	arr[i][j]=Integer.parseInt(input2[j]);
    }
  }

세번째

  //3
  Scanner sc = new Scanner(System.in);
  
  n = sc.nextInt();
  m = sc.nextInt();
  sc.nextLine();
  
  for(int i=0; i<n; i++){
    for(int j=0; j<m; j++){
    	arr[i][j] = sc.nextInt();
    }
  }

네번째(띄어쓰기 없이 입력받는 경우)

import java.io.*;
import java.util.*;

public class Solution {
    static int[][] arr = new int[301][301];
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        for(int i=0; i<n; i++){
            String str = br.readLine();
            for(int j=0; j<m; j++){
                arr[i][j] = str.charAt(j) - '0';
            }
        }

        StringBuilder sb = new StringBuilder();
        for (int i=0; i<n; i++){
            for (int j=0; j<m; j++){
                sb.append(arr[i][j]);
            }
            sb.append('\n');
        }
        System.out.println(sb);
    }
}
profile
나는야 개발자

0개의 댓글