https://school.programmers.co.kr/learn/courses/30/lessons/12951#
문제 설명
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다.
단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.
제한 조건
s는 길이 1 이상 200 이하인 문자열입니다.
s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
숫자는 단어의 첫 문자로만 나옵니다.
숫자로만 이루어진 단어는 없습니다.
공백문자가 연속해서 나올 수 있습니다.
첫번째 코드 (실패)
단순하게 공백 문자 기준으로 문자열을 자르고, char 배열로 만들어서 인덱스가 0인 경우와 아닌 경우로 첫 문자를 구분하려고 했다. 문자를 치환한 뒤에는 공백 문자를 붙여서 다시 문자열로 만들었다. 제한 조건을 제대로 파악하지 않아서(...) 연속된 공백을 고려하지 않았다는 문제가 있다.
첫번째 코드
private static String old_solution(String s) {
StringBuilder answer = new StringBuilder();
// 공백으로 자르기
String[] strArr = s.split(" ");
for(int i=0; i < strArr.length; i++) {
// 처음과 끝이 공백이거나, 연속한 공백 문자인 경우
if(strArr[i].isBlank()) {
answer.append(strArr[i]);
continue;
}
char[] chArr = strArr[i].toCharArray();
for(int j=0; j< chArr.length; j++) {
char ch = chArr[j];
// 숫자인 경우 넘어감
if(Character.isDigit(ch)) {
continue;
}
// 첫 글자가 소문자이면 대문자로 치환
if(j == 0 && Character.isLowerCase(ch)) {
chArr[j] = Character.toUpperCase(ch);
}
// 첫글자가 아닌데 대문자이면 소문자로 치환
else if(j != 0 && Character.isUpperCase(ch)) {
chArr[j] = Character.toLowerCase(ch);
}
}
answer.append(chArr).append(" ");
}
return answer.toString();
}
개선한 코드 (성공)
주어진 공백 문자를 변형하지 않기 위해서 바로 char 배열로 변환한다.
첫 문자 여부를 구분하기 위해서 인스턴스 변수를 사용하여 공백 문자인 경우 그 다음 문자는 첫 문자라고 가정한다.
여러번 공백 문자가 나오더라도 첫 문자 여부만 지정하기 때문에 문제없다.
그 다음엔 changeCase() 메소드를 사용해 조건에 맞게 문자를 치환한다. 치환한 문자를 char 배열의 값에 넣는다.
첫 문자 여부를 false 로 변경하여 다시 공백 문자가 나올 때까지는 첫 문자가 아님을 알 수 있도록 한다.
Class Solution {
boolean isFirstChar = true;
public String solution(String s) {
char[] charArr = s.toCharArray();
for(int i = 0; i < charArr.length; i++) {
// 공백 문자인 경우 flag true 로 변경
if(String.valueOf(charArr[i]).isBlank()) {
isFirstChar = true;
continue;
}
char newCh = changeCase(charArr[i]);
charArr[i] = newCh;
isFirstChar = false;
}
return String.valueOf(charArr);
}
/**
* 조건에 맞게 치환한다.
*/
private static char changeCase(char ch) {
char result = ch;
// 첫 문자인데 소문자이면 대문자로 치환
if(isFirstChar && Character.isLowerCase(ch)) {
result = Character.toUpperCase(ch);
}
// 첫 문자가 아닌데 대문자이면 소문자로 치환
else if(!isFirstChar && Character.isUpperCase(ch)) {
result = Character.toLowerCase(ch);
}
return result;
}
}
'solve' 카테고리의 다른 글
| [프로그래머스] Lv2.숫자의 표현 (0) | 2024.11.04 |
|---|---|
| [프로그래머스] Lv2.이진 변환 반복하기 (0) | 2024.11.01 |
| [프로그래머스] Lv2. 최솟값 만들기 (그리디) (0) | 2024.10.29 |
| [프로그래머스] Lv2. 올바른 괄호 (스택/큐) (1) | 2024.10.28 |
| [프로그래머스] Lv2. 최댓값과 최솟값 (0) | 2024.10.25 |