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+")는 단순한 문자열이 아니라 정규 표현식이기 때문에 split(" ")보다 시간이 더 걸릴 수 있어요.
split(" ")는 정확히 하나의 공백만 기준으로 나눕니다. 반면 split("\s+")는 탭, 줄바꿈, 여러 개의 공백까지도 전부 처리하기 때문에 더 복잡한 연산이 수행됩니다.
입력이 매우 짧거나 간단한 경우에는 split(" ") + trim() + isEmpty(), 반대로 입력이 긴 문장이고 중간에 공백이 여러 번 반복되는 경우엔 split("\s+")가 더 효율적일 수도 있어요 (반복문 없기 때문).
성능상 이유는 정규표현식 사용으로 인한 추가 연산 때문입니다.
그러나 split("\s+")는 코드가 간결하고 공백이 여러 개 있을 가능성까지 커버하므로 입력 형태에 따라 선택하는 것이 좋아요.