[Algorithm/Java] 백준 1152번 - 단어의 개수
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+")
사용
댓글남기기