오늘의 키워드
•
문자열 처리
•
공백 유지
•
Character 클래스
문제 파악 및 풀이
•
처음에는 s.split(" ") 방식으로 접근했는데, 공백이 연속으로 들어올 경우 split 결과에서 해당 공백이 사라지는 문제가 발생했다.
•
즉, 공백을 기준으로 나누면 빈 문자열은 제거되기 때문에, 원래 문자열의 형태를 복원할 수 없었다.
•
이로 인해 오답이 발생했고, 문제를 다시 읽어보니 공백도 그대로 유지되어야 한다는 조건이 있었다.
•
StringTokenizer의 countTokens() 메서드를 처음 알게 되어 사용해보았지만, 이 역시 공백 유지에는 적절하지 않았다.
•
최종적으로는 문자열을 문자 단위로 순회하면서 직접 구현하였다.
시도한 풀이 (44/100점)
import java.util.*;
import java.io.*;
class Solution {
public String solution(String s) {
String answer = "";
StringTokenizer st = new StringTokenizer(s);
int len = st.countTokens();
for (int i = 0; i < len; i++) {
String str = st.nextToken().toLowerCase();
String temp = "";
temp += str.charAt(0);
temp = temp.toUpperCase();
temp += str.substring(1);
answer += temp + " ";
}
return answer.trim();
}
}
Java
복사
•
문제점: StringTokenizer는 연속된 공백을 무시하기 때문에, 공백 유지 조건을 만족하지 못함.
최종 풀이 (정답)
import java.util.*;
import java.io.*;
class Solution {
public String solution(String s) {
String answer = "";
int len = s.length();
boolean isFirst = true;
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
if (c == ' ') {
isFirst = true;
} else if (isFirst) {
c = Character.toUpperCase(c);
isFirst = false;
} else {
c = Character.toLowerCase(c);
}
answer += c;
}
return answer;
}
}
Java
복사
•
문자 하나하나를 직접 처리하면서 첫 문자 여부를 확인해 대소문자를 변경했다.
•
Character.toUpperCase()와 Character.toLowerCase()를 활용하여 문제 조건을 만족시켰다.
시간 복잡도
•
O(N)
문자열의 길이 N만큼 순회하면서 처리하므로 시간 복잡도는 O(N) 이다.
오늘의 회고
어려웠던 점
•
문제를 처음 읽고 문자열을 공백 기준으로 나눈 뒤 처리하는 방식이 떠올랐지만, 공백 유지 조건을 고려하지 못했다.
•
split()과 StringTokenizer의 특성을 정확히 파악하지 못해 불필요한 시행착오가 있었다.
개선점
•
문자열 관련 문제에서는 입출력 형식과 조건을 꼼꼼히 확인하는 습관이 중요하다는 걸 다시 느꼈다.
•
다양한 문자열 처리 방식(split, StringTokenizer, 문자 순회 등)에 대한 이해도를 높여야겠다.
•
특히 문제를 너무 빠르게 판단하지 말고, 조건을 꼼꼼히 읽자.