will come true

[BOJ] 백준 1152 번 - 단어의 개수 (Java) 본문

카테고리 없음

[BOJ] 백준 1152 번 - 단어의 개수 (Java)

haehyun 2022. 2. 7. 15:50
728x90

문제

https://www.acmicpc.net/problem/1152

 

1152번: 단어의 개수

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열

www.acmicpc.net

 

코드

A. StringTokenizer를 사용하는 방법

import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        StringTokenizer st = new StringTokenizer(s, " ");

        System.out.print(st.countTokens());
    }
}

 

  • java.util.StringTokenizer 클래스
    • 긴 문자열을 지정된 구분자를 기준으로 코튼(token)이라는 여러 개의 문자열로 잘라낸다.
    • 단, 구분자로 단 하나의 문자 밖에 사용하지 못한다. 
    • 구분자를 토큰으로 간주할지 여부는 생성자의 3번째 매개변수(boolean)로 설정할 수 있다.
    • countTokens() : 전체 토큰의 수를 반환한다.

 

B. split() 메서드를 사용하는 방법

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        String s = sc.nextLine();
        // 공백, 빈문자열 체크
        if(s.isEmpty() || s.equals(" ")) {
            System.out.println(0);
        } else {
            // 앞뒤 공백 제거, 공백 한칸으로 분할
            String[] word = s.trim().split(" ");
            System.out.println(word.length);
        }
    }
}

 

  • String[] split(String regex) 메서드
    • 문자열을 지정된 구분자으로 나누어 문자열 배열에 담아 반환한다.
    • StringTokenizer와 달리 구분자로 정규식 표현(regular expression)을 사용할 수 있다.
  • 단, split() 메서드는 정규식에 매칭되지 않을 경우 자기자신을 반환한다. 즉, 공백 한칸(" ")을 기준으로 문자열을 분리할 때, 기준 문자열에 공백 한칸이 존재하지 않는 다면 그 기준 문자열을 그대로 반환한다.
메서드 반환되는 문자열 배열 배열 크기
"Hello World".split(" ") [Hello, World] 2
"Hello".split(" ") [Hello] 1
"".split(" ") [] 1

 

  • 여기서 주의해야 하는 게 split() 메서드를 사용하는 문자열이 3번째 경우처럼 '빈 문자열'일 경우이다. 빈 문자열("")은 null 과 달리 문자열 값(value)이 존재는 한다. 단지, 아무 문자없이 비어있을 뿐.
    • 빈 문자열("") : String 타입 변수가 참조하고 있는 인스턴스가 있으며, 단지 그 인스턴스 값이 비어있을 뿐임.
    • null : String 타입 변수가 참조하고 있는 인스턴스가 없음.
  • 빈 문자열에는 단어가 하나도 존재하지 않기 때문에 출력 값이 0이어야 한다. 이를 위해 split() 함수 전에 입력받은 문자열이 공백으로만 이루어져 있거나, 빈 문자열인지 별도로 체크해줘야 한다. (공백으로 이루어진 문자열도 trim() 메서드를 사용하면 공백이 제거되어 빈문자열이 됨.)

 

Key Point

  • StringTokenizer 와 split() 은 둘 다 구분자를 기준으로 문자열을 분리하는 기능을 하지만, 작동방식이 다르다는 것을 유념하자.
  • 문자열 처리 문제는 자신이 사용하는 언어에 어떤 문자열 처리 기능의 클래스 / 메서드가 존재하는지, 각 기능은 어떻게 되는지 숙지하고 있는 것이 중요하다. 이 문제도 StringTokenizer클래스와 split() 메서드의 존재를 몰랐다면, charAt(int index) 또는 toCharArray() 와 같이 문자열의 문자를 하나씩 쪼개서 공백 여부를 체크했어야 했을 것이다.
728x90
Comments