JadenCase 문자열 만들기

문제정의


영어 문자열이 주어질 때 공백을 기준으로 첫문자만 대문자로 만드는 프로그램을 작성하는 문제이다. 만약 첫문자가 영어가 아니라면 이어지는 문자들은 모두 소문자로 한다.

문제풀이


전체 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package level2;

public class JadenCase {

//프로그래머스 문제풀이 level2 JadenCase 문자열 만들기
public static void main(String[] args) {
String s = " s ab ";
String[] words = s.split(" ");
StringBuilder buff = new StringBuilder();
for(String str : words)
{
if(str.equals(""))
{
buff.append(" ");
continue;
}
else if(str.charAt(0) < 65 || str.charAt(0) > 123)
{
buff.append(str.toLowerCase());
}
else
{
buff.append(str.substring(0,1).toUpperCase());
buff.append(str.substring(1).toLowerCase());
}
buff.append(" ");
}
if(s.length() < buff.length())
buff.delete(buff.length()-1, buff.length());
else if(s.length() > buff.length())
buff.append(" ");
System.out.println(buff.toString());
}

}
공백이 하나가 아니라 여러개인 경우 고려할게 좀 더 많아진다. 어쨌든 스페이스 한칸을 기준으로 단어를 쪼갠다. 이때 만약 공백이 여러개이면 아무것도 들어있지 않은 문자열이 생성된다. 이제 잘려진 문자열별로 처리를 해주면된다. 1. 들어온 문자가 아무것도 없는 경우 원래 입력이 공백이므로 공백을 버퍼에 넣은 뒤 넘어간다. 2. 문자열의 맨 앞이 영어가 아닌 경우(아스키 코드로 판단), 영문을 모두 소문자로 만든 뒤 버퍼에 붙여넣는다. 3. 만약 첫문자가 영문인 경우 첫번째만 대문자로 바꾸고 나머지는 소문자로 변환하여 붙인다. 4. 한 문자열 처리를 마칠 때 마다 공백을 붙인다.

이 처리가 끝나면 한가지 예외 케이스가 생긴다 바로 문자열의 맨끝에 공백이 있을 경우와 없을 경우를 잡아내지 못하는 것이다. 따라서 조건을 하나 더 추가하여 원래 문자열보다 작은지 큰지를 비교하여 작다면 공백을 추가하고 크다면 공백을 한 칸 제거한다.

최종 시간복잡도는 문자열 s의 길이를 n이라 할 때 \(O(n)\)이다.

테스트



공백 여러개를 처리하는 과정에서 약간 헤맸었는데, 다른 사람의 풀이를 보니 flag를 이용해서 코드를 더 간결하게 짠 것을 보고 감탄했다. 다음엔 나도 flag를 이용해 문제를 풀어야겠다.