
✅ 문제
https://school.programmers.co.kr/learn/courses/30/lessons/12951
🔑 풀이
❗️틀린 코드
import java.util.*;
class Solution {
public String solution(String s) {
String[] words = s.toLowerCase().split(" "); // 공백 기준으로 단어 나눔
StringBuilder sb = new StringBuilder();
for(int i = 0; i < words.length; i++) {
String word = words[i];
if(word.length() > 0) {
char firstChar = word.charAt(0); // 단어 맨 앞글자
if(Character.isLetter(firstChar)) { // 맨 앞글자가 알파벳인 경우
sb.append(Character.toUpperCase(firstChar));
sb.append(word.substring(1)); // 문자열 잘라서 붙이기
} else {
sb.append(word); // 숫자 등으로 시작하는 경우, 그대로
}
}
if(i < words.length - 1) {
sb.append(" "); // 단어들 사이에 공백 추가, 마지막 단어에는 공백 추가 x
}
}
return sb.toString();
}
}
처음 구현한 코드에서 테스트케이스를 통과하지 못하는 오류가 발생했다.
문제 제한 조건에 있는 공백문자가 연속해서 나올 수 있는 경우를 고려하지 않았다.
예를 들어, "hello world" → "hello", " ", "world" 사이에 여러 개의 연속된 공백이 있다.
하지만 처음 구현한 코드에서는 split(" ") 을 사용하면서 문제가 생겼다.
String[] words = s.toLowerCase().split(" ");
이렇게 구현하는 경우, 자바에서 연속된 공백을 무시해서 split을 하기 때문에
"hello world" 를 ["hello", "", "", "world"]처럼 잘 나누지 못하는 경우가 있다.
사실 split(" ")는 연속된 공백을 빈 문자열로 처리해주긴 하지만,
문제는 입력 문자열의 맨 앞이나 맨 뒤에 공백이 있을 때 그걸 복원하지 못한다는 것이다.
✅ 예시
입력: " for the king "
→ 원하는 출력: " For The King " (공백 포함해서 유지되어야 함)
→ 지금 코드: "For The King" (앞뒤 공백 사라짐)
💡 해결 방법: 문자열 전체를 앞에서부터 하나씩 직접 순회
다시 구현할 때 split을 쓰지 않고, 문자열을 char 단위로 순회하면서 처리하는 방식으로 했다.
import java.util.*;
class Solution {
public String solution(String s) {
StringBuilder sb = new StringBuilder();
boolean newWord = true; // 새로운 단어의 시작(첫 문자) 여부
for(char c : s.toCharArray()) {
if(c == ' ') {
sb.append(c); // 공백이면 그대로 추가
newWord = true; // 공백 후 다음 문자는 새로운 단어의 첫글자
} else {
if(newWord) {
sb.append(Character.toUpperCase(c)); // 단어의 첫 글자면 대문자로 추가
newWord = false; // 단어 중간이니 false로 변경
} else { // 단어의 첫 글자가 아니여서 소문자로 추가
sb.append(Character.toLowerCase(c));
}
}
}
return sb.toString();
}
}
어떻게 통과했지만 아래에 첨부한 다른 사람의 풀이를 보니 내가 겪었던 오류 과정이 한번에 해결되었다.
📌 다른 사람의 풀이
class Solution {
public String solution(String s) {
String answer = "";
String[] sp = s.toLowerCase().split("");// 글자 하나하나씩 배열에 저장
boolean flag = true; // 단어의 첫 글자 판단 여부
for(String ss : sp) {
answer += flag ? ss.toUpperCase() : ss;
flag = ss.equals(" ") ? true : false;
}
return answer;
}
}
문자열을 전부 소문자로 바꾼 뒤, 글자 하나하나를 나눠 배열에 저장한다.
지금 문자가 공백(" ")이라면 그 다음 문자는 새로운 단어의 첫 글자니깐 flag가 true, 그렇지 않으면 false
입력값 s에 공백문자가 연속되거나 맨 앞/뒤에 공백이 있어도 문제없다.
'프로그래머스' 카테고리의 다른 글
99클럽 코테 스터디 16일차 TIL - 프로그래머스 : 신규아이디 추천 (0) | 2025.04.21 |
---|---|
99클럽 코테 스터디 3일차 TIL - 프로그래머스 : 바탕화면 정리 (0) | 2025.04.02 |
[프로그래머스] 롤케이크 자르기 - LV2 (1) | 2025.02.14 |
[프로그래머스] 오픈채팅방 - LV 2 (3) | 2025.02.12 |
[프로그래머스] 디펜스 게임 - LV 2 (0) | 2025.02.12 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!