문자열 쪼개기 StringTokenizer

OneTwoThree·2023년 8월 30일
0

자바

목록 보기
15/19

출처


StringTokenizer를 통해 문자열을 쪼갤 수 있다.

생성자

        // 기본 delimiter로 분리 \t \n \r
        StringTokenizer st1 = new StringTokenizer(line);
        // " " 를 기준으로 분리 
        StringTokenizer st2 = new StringTokenizer(line," ");
        // " " 까지 분리된 결과에 포함함
        StringTokenizer st3 = new StringTokenizer(line," ", true);

3가지 생성자가 있다.
첫번째 인자만 전달할 경우 인자를 기본 delim에 의해 분리한다.
두번째 인자로 delim을 전달할 경우 해당 delim에 의해 분리한다.
세번째 인자로 boolean 값을 전달해서 delim을 분리된 결과에 포함할 지 정할 수 있다

메서드

        while(st1.hasMoreTokens()){
            System.out.println(st1.nextToken());
        }

countTokens : 토큰의 개수를 반환한다
hasMoreTokens : 다음의 토큰이 있는지 boolean을 반환한다
nextToken : 다음의 토큰을 String으로 반환한다

활용

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

public class Main{

    static int front = -1;
    static int rear = -1;
    static int[] q = new int[2000000];

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int count = Integer.parseInt(br.readLine());

        BufferedWriter bf = new BufferedWriter(new OutputStreamWriter(System.out));
        for (int i=0; i<count; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());

            switch (st.nextToken()) {
                case "push":
                    push(Integer.parseInt(st.nextToken()));
                    break;
                case "pop" :
                    bf.write(String.valueOf(pop()));
                    bf.write("\n");
                    break;
                case "size":
                    bf.write(String.valueOf(size()));
                    bf.write("\n");
                    break;
                case "empty":
                    bf.write(String.valueOf(empty()));
                    bf.write("\n");
                    break;
                case "front":
                    bf.write(String.valueOf(front()));
                    bf.write("\n");
                    break;
                case "back":
                    bf.write(String.valueOf(back()));
                    bf.write("\n");
                    break;
            }
        }
        bf.flush();
        bf.close();
    }

    public static void push(int input){
        q[++rear] = input;
    }
    public static int pop(){
        if (empty()==1) return -1;
        return q[++front];
    }

    public static int size(){
        return rear-front;
    }

    public static int empty(){
        if (size()==0){
            return 1;
        } else {
            return 0;
        }
    }

    public static int front(){
        if (empty()==1){
            return -1;
        } else {
            return q[front+1];
        }
    }

    public static int back(){
        if (empty()==1){
            return -1;
        } else {
            return q[rear];
        }
    }
}

활용 문제
Queue를 구현하는 문제인데, 입출력 시간 제한이 꽤 타이트하다.

따라서 빠른 입력을 위해 Scanner가 아닌 BufferedReader를 사용하면 readLine을 통해\n을 기준으로 입력받게 된다

이 때 중간의 공백이 있는 경우 문자열을 쪼개기 위해 StringTokenizer를 사용해 줬다.

0개의 댓글