1 분 소요



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



📌 문제

문제 유형

  • 구현
  • 문자열


문제 설명

  • 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오.
  • 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.
  • 단어는 공백 한 칸을 기준으로 구분되며, 공백만 있는 경우 단어는 없다.


입출력 예시

입력1

The Curious Case of Benjamin Button

출력1

6


입력2

 The first character is a blank

출력2

6



🔍 문제 풀이

  • 한 줄을 입력받고, 양쪽 공백을 trim()으로 제거한다.
    • trim(): 문자열의 앞뒤 공백만 제거
  • 공백 기준으로 나누기 위해 split("\\s+")를 사용한다. (split(" ")은 공백이 두 개 이상일 경우 문제가 생길 수 있음)
  • 만약 공백만 입력되거나 아무 것도 없을 경우, isEmpty() 체크로 0 출력


split(“\s+”)

split("\\s+")를 써야 하는 이유

  • \\s+는 공백 문자(스페이스, 탭 등) 1개 이상을 의미하는 정규식
  • 즉, “공백만 연속된 부분은 무시하고, 단어만 잘라내겠다” 는 뜻
  • 단어 사이에 공백이 여러 개 있어도 정확하게 나눠줌
  • trim()과 함께 쓰면 앞뒤 공백도 안전하게 제거


split(" ")만 쓰면 생기는 문제

  • 공백이 연속되면 빈 문자열(““)도 배열에 포함됨
  • 단어 사이와 앞뒤에 불필요한 요소들까지 생김
String input = "  hello   world  ";

System.out.println(input.split(" ").length);           // 5 (빈 문자열 포함), ["", "", "hello", "", "", "world", "", ""]
System.out.println(input.trim().split("\\s+").length); // 2 (정확한 단어 개수), ["hello", "world"]



💻 전체 코드

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

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

        String str = br.readLine().trim();

        if(str.isEmpty()){
            System.out.println(0);
        }else{
            String[] splited = str.split("\\s+");
            System.out.println(splited.length);
        }

    }
}



💭 배운 점

  • 공백만 입력됐는지 확인하려면 isEmpty() 체크 필요
  • 앞뒤 공백 제거를 위해 trim() 필수
  • split(" ")은 공백 여러 개를 제대로 처리 못함 → split("\\s+") 사용


카테고리:

업데이트:

댓글남기기