[프로그래머스/181868] 공백으로 구분하기2

☑️ 문제

프로그래머스 181868

☑️ 풀이

첫 번째 풀이

//시간: 0.20ms
//메모리: 81.7MB

import java.util.*;

class Solution {
    public String[] solution(String my_string) {
        String[] arr = my_string.split(" ");
        List<String> list = new ArrayList<>();

        for (String str : arr) {
            if (!str.equals("")) {
                list.add(str);
            }
        }

        String[] answer = new String[list.size()];
        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }

        return answer;
    }
}
  • 먼저 my_string“ “(공백) 으로 잘라 배열을 생성한다.
  • 그 뒤, 배열에 공백을 제외한 원소만 다시 리턴한다.

두 번째 풀이

//시간: 0.36ms
//메모리: 82.5MB

import java.util.*;

class Solution {
    public String[] solution(String my_string) {
        StringTokenizer st = new StringTokenizer(my_string);
        String[] answer = new String[st.countTokens()];
        int idx = 0;
        while (st.hasMoreTokens()) {
            answer[idx++] = st.nextToken();
        }
        return answer;
    }
}
  • Tokenizer 를 사용하여 한 개 이상의 공백으로 구분되어 있는 문자열을 분리할 수 있었다.

☑️ 문법 정리 - StringTokenizer

StringTokenizer?

  • java.util 패키지에 속하는 클래스이다.
  • 구분자를 기준으로 문자열을 나누어 토큰(token) 단위로 처리한다.
  • split() 과 유사하지만 split() 은 배열을 반환하는 반면, StringTokenizer 는 토큰을 하나씩 순차적으로 처리할 수 있다.

StringTokenizer 생성자

기본 생성자

StringTokenizer st = new StringTokenizer(String str);
  • 공백을 기준으로 문자열을 나눈다.

구분자를 지정하는 생성자

StringTokenizer st = new StringTokenizer(String str, String delimiter);
  • delimiter 에 지정된 문자를 기준으로 문자열을 나눈다.

구분자를 토큰에 포함할 지 여부를 지정하는 생성자

StringTokenizer st = new StringTokenizer(String str, String delimiter, boolean returnDelims);
  • returnDelimstrue 이면 구분자도 토큰으로 포함된다.

주요 메서드

메서드설명
boolean hasMoreTokens()남아 있는 토큰이 있는 지 확인한다. (있으면 true 리턴)
String nextToken()다음 토큰을 반환한다.
String nextToken(String delim)새 구분자를 지정하고, 다음 토큰을 반환한다.
int countTokens()남아 있는 토큰 개수를 반환한다.

예제

기본 사용 (공백 기준)

import java.util.StringTokenizer;

public class StringTokenizerExample {
    public static void main(String[] args) {
        String str = "Java is fun to learn";
        StringTokenizer st = new StringTokenizer(str);
       
	      while (st.hasMoreTokens()) {
	          System.out.println(st.nextToken));
	      }
    }
}

**// 출력**
// Java
// is
// fun
// to
// learn

특정 구분자 사용(, 기준)

import java.util.StringTokenizer;

public class StringTokenizerExample {
    public static void main(String[] args) {
        String str = "apple,banana,grape,orange";
        StringTokenizer st = new StringTokenizer(str, ",");
        
        while (st.hasMoreTokens()) {
		        System.out.println(st.nextToken());
        }
    }
}

// 출력
// apple
// banana
// grape
// orange

구분자도 포함하기 (returnDelims = true)

import java.util.StringTokenizer;

public class StringTokenizerExample {
    public static void main(String[] args) {
        String str = "Hello,World!";
        StringTokenizer st = new StringTokenizer(str, ",", true);
        
        while (st.hasMoreTokens()) {
            System.out.println(st.nextToken());
        }
    }
}

// 출력
// Hello
// ,
// World
// !

언제 StringTokenizer를 사용해야 할까?

  • 순차적으로 토큰을 처리할 때는 StringTokenizer를, 배열을 한 번에 얻고 싶을 때는 split() 이 유용하다.
  • StringTokenizer 는 메모리 사용량을 줄이고자 할 때 유용하다.

© 2021. All rights reserved.

yaejinkong의 블로그