기준
문자열 문제는 로직이 맞아도 객체를 너무 많이 만들면 느려진다. 문자 단위 순회는 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 풀이 접근