[java] 백준 1152

‍박소연·2025년 7월 26일

공백 구분이 핵심 !

  • spilt, trim, replace 가 문자열 공백 관련 함수
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int count = 0;
        // 공백이 연속해서 나오는 경우는 없다. -> 공백이 한 번만 나오게
        String s = sc.nextLine().trim(); // 앞 뒤 공백 제거
        String[] strings = s.split(" "); // 공백 기준으로 분할

        for (int i = 0; i < strings.length; i++) {
            strings[i] = strings[i];
            if(!strings[i].isEmpty()) {
                count++;
            }
        }
        System.out.println(count);
    }
}

지금은 trim() 함수로 앞 뒤 여백을 한 번 자르고, split()으로 여백 기준으로 나눠서 담은 뒤에 공백 안들어있는 배열의 원소만 count 하는데 이걸 더 효율적으로 바꿀 수 없을까?


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 공백이 연속해서 나오는 경우는 없다. -> 공백이 한 번만 나오게
        // spilt, trim, replace 가 문자열 공백 관련 함수
        String s = sc.nextLine().trim(); // 앞 뒤 공백 제거

        if(s.isEmpty()) {
            // 빈 문자열이지만 length가 1이 되기 때문에
            System.out.println("0");
        } else {
            String[] strings = s.split("\\s+"); // 하나 이상의 공백 기준으로 분할
            System.out.println(strings.length);
        }
    }
}

왜 split("\s+") 코드가 더 느릴 수 있는가?

1. 정규 표현식 파싱 비용

split("\s+")는 단순한 문자열이 아니라 정규 표현식이기 때문에 split(" ")보다 시간이 더 걸릴 수 있어요.

2. 내부 구현 차이

split(" ")는 정확히 하나의 공백만 기준으로 나눕니다. 반면 split("\s+")는 탭, 줄바꿈, 여러 개의 공백까지도 전부 처리하기 때문에 더 복잡한 연산이 수행됩니다.

3. 입력 문자열에 따라 시간 차이

입력이 매우 짧거나 간단한 경우에는 split(" ") + trim() + isEmpty(), 반대로 입력이 긴 문장이고 중간에 공백이 여러 번 반복되는 경우엔 split("\s+")가 더 효율적일 수도 있어요 (반복문 없기 때문).

  • a b c .trim().split("\s+") → ["a", "b", "c"]
  • a b c .trim().split(" ") → ["", "", "", "a", "", "b", "", "", "c"]

💡 결론

  • 성능상 이유는 정규표현식 사용으로 인한 추가 연산 때문입니다.

  • 그러나 split("\s+")는 코드가 간결하고 공백이 여러 개 있을 가능성까지 커버하므로 입력 형태에 따라 선택하는 것이 좋아요.

0개의 댓글