백준(Java)

백준 1152번 '단어의 개수' (자바)

심층코드 2025. 4. 27. 17:55

문제

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

입력

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

출력

첫째 줄에 단어의 개수를 출력한다.

 

예제 입력 1 

The Curious Case of Benjamin Button

예제 출력 1 

 

6

예제 입력 2 

 The first character is a blank

 

예제 출력 2 

6

예제 입력 3 

The last character is a blank 

예제 출력 3 

6

 

 

코드

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

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String S = sc.nextLine().trim(); 

        if (S.isEmpty()) {
            System.out.println(0);
        } else {
            String[] words = S.split(" "); 
            System.out.println(words.length);
        }
        sc.close();
    }
}

 

 

코드지식

1. trim()의 역할은 문자열의 맨 앞(leading)과 맨 뒤(trailing)에 있는 공백 문자(스페이스, 탭, 줄 바꿈 등)를 제거하는 것이 전부입니다.

문자열의 중간에 있는 공백은 한 개든 여러 개가 연속되어 있든, trim() 메소드를 호출해도 전혀 영향을 받지 않고 그대로 유지됩니다.

 

문자열의 중간에 있는 공백은 한 개든 여러 개가 연속되어 있든, trim() 메소드를 호출해도 전혀 영향을 받지 않고 그대로 유지됩니다.

 

만약 연속된 공백을 하나로 줄이고 싶다면, trim() 메소드만으로는 불가능하고 다른 방법을 사용해야 합니다. 예를 들어, 정규 표현식을 사용하여 공백이 하나 이상 연속되는 부분을 하나의 공백으로 치환하는 방법을 사용할 수 있습니다.

Java
 
String textWithMultipleSpaces = "  Hello   World  ";
String singleSpacedText = textWithMultipleSpaces.trim().replaceAll("\\s+", " ");
System.out.println("[" + singleSpacedText + "]"); // 출력: [Hello World]

위의 예시에서는 trim()으로 앞뒤 공백을 먼저 제거한 후, replaceAll("\\s+", " ")를 사용하여 하나 이상의 공백 문자(\\s+)를 하나의 공백(" ")으로 바꿉니다.

 

2. String[] words = S.split(" "); 코드에서 new 키워드를 사용하여 String 배열 객체를 직접 생성할 필요는 없습니다.

 

 

 

3. toCharArray() - 문자열 전체를 char 배열로 변환:

 

 toCharArray()는 문자열의 모든 문자를 순서대로 담는 새로운 char 배열을 생성하여 반환합니다.

가장 일반적이고 직접적인 문자열-char 배열 변환 방법입니다.

String str = "Hello";
char[] charArray = str.toCharArray(); // {'H', 'e', 'l', 'l', 'o'}