1 . 문제 설명
JadenCase: 모든 단어의 첫 문자가 대문자이고, 그 외의 알베벳은 소문자인 문자열.
단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자.
문자열 s를 JadenCase로 바꾼 문자열을 리턴하는 함수를 구한다.
- s는 길이 1 이상 200 이하인 문자열
- s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있음
- 숫자는 단어의 첫 문자로만 나옴
- 숫자로만 이루어진 단어는 없음
- 공백문자가 연속해서 나올 수 있음
2. 접근 방식
- for문으로 s를 한 문자씩 char로 변환한다.
- 현재 문자가 공백이면
- boolean prevBlank를 true로 설정한다.
- 현재 문자가 prevBlank가 true일 때
- 대문자로 변환한다.
- prevBlank를 false로 설정한다.
- 현재 문자가 prevBlank가 false일 때
- 소문자로 변환한다.
- 위 조건 모두 정답 문자열에 추가한다.
- 현재 문자가 공백이면
3. 최종 코드
import java.io.*;
public class Solution {
public String solution(String s) {
StringBuilder answer = new StringBuilder();
boolean prevBlank = true; // 이전 문자가 공백이었는지
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == ' ') {
// 공백일 경우 다음 문자를 단어의 시작으로 처리
prevBlank = true;
answer.append(c);
} else {
if (prevBlank) {
// 단어의 첫 글자: 알파벳이면 대문자로, 숫자는 그대로
if (c >= 'a' && c <= 'z') {
c = (char) (c - 32);
}
prevBlank = false; // 다음은 단어의 시작이 아님
} else {
// 담어의 나머지 글자: 알파벳이면 소문자로, 숫자는 그대로
if (c >= 'A' && c <= 'Z') {
c = (char) (c + 32);
}
}
answer.append(c);
}
}
return answer.toString();
}
}
시간복잡도: $O(N)$
$N$: 문자열 길이
4. 분석 및 참고사항
더 간단한 코드
public class Solution {
public String solution(String s) {
StringBuilder result = new StringBuilder();
boolean isStart = true;
for (char c : s.toCharArray()) {
if (isStart) {
result.append(Character.toUpperCase(c));
} else {
result.append(Character.toLowerCase(c));
}
isStart = (c == ' ');
}
return result.toString();
}
}
- 현재 문자가 공백이면 다음 문자가 단어 시작임을 캐치하는 것이 중요
- 공백을 만나면 isStart 를 true 로 전환 → 다음 문자에 대문자 처리
- 공백이나 숫자는 대문자 처리해도 변동이 없기 때문에 따로 처리할 필요 x
최적화 포인트
- Split 지양: 공백 손실 때문에 직접 순회 방식이 안정적
- Boolean 사용: 조건 부로 무언갈 조치할 때 적합
- 필요 없는 기능 x: 문자인지 숫자인지 공백인지 굳이 판별해 가며 필요 없는 시간 낭비를 할지 않음
반응형
'알고리즘 문제 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 입국심사 (Java) (0) | 2024.07.29 |
|---|---|
| [프로그래머스] 다리를 지나는 트럭 (0) | 2024.07.11 |
댓글