기준

문자열 문제는 로직이 맞아도 객체를 너무 많이 만들면 느려진다. 문자 단위 순회는 charAt, 누적 출력은 StringBuilder를 먼저 떠올린다.

문자열 처리 지도

flowchart TD Task["문자열 작업"] --> Unit{"무엇을 하는가"} Unit -->|한 글자씩 읽기| CharAt["charAt"] Unit -->|구분자로 나누기| Split["split"] Unit -->|결과 누적| Builder["StringBuilder"] Unit -->|내용 비교| Equals["equals"] Unit -->|숫자 문자 변환| Digit["ch - '0'"]

한 글자씩 보려고 split("") 사용

발생 장면

PG12909 올바른 괄호에서 괄호 문자를 보기 위해 split("")으로 String[]를 만들었다.

String[] arr = s.split("");
for (String ch : arr) {
    // 문자 처리
}

문자 하나씩만 필요하면 배열을 만들 필요가 없다.

for (int i = 0; i < s.length(); i++) {
    char ch = s.charAt(i);
}

상세: PG12909 분석

반복문에서 문자열을 +로 누적

증상

출력할 문자열이 많을 때 시간이 늘어난다.

String answer = "";
for (String word : words) {
    answer += word + "\n";
}

String은 불변이라 새 문자열이 계속 만들어진다.

StringBuilder sb = new StringBuilder();
for (String word : words) {
    sb.append(word).append('\n');
}

숫자 문자를 숫자로 착각

char ch = '7';
int value = ch; // 55

문자 코드가 들어간다. 한 자리 숫자는 '0'을 뺀다.

int value = ch - '0'; // 7

문자열 비교에 == 사용

==는 참조 비교다. 입력으로 만들어진 문자열은 같은 내용이어도 다른 객체일 수 있다.

if (word.equals(target)) {
    // 내용 비교
}

상수와 비교할 때는 NPE를 피하려고 상수를 앞에 둘 수 있다.

if ("YES".equals(answer)) {
}

출력마다 바로 println()

출력이 많은 문제는 StringBuilder에 모아 한 번에 출력한다.

관련: BOJ1927 풀이 접근