코딩테스트 연습에 공개된 문제는 (주)그렙이 저작권을 가지고 있습니다.
(지문 하단에 별도 저작권 표시 문제 제외)
코딩테스트 연습 문제의 지문, 테스트케이스, 풀이 등과 같은 정보는 비상업적, 비영리적 용도로 게시할 수 있습니다.
문제 정보
- 프로그래머스
- Java
- level 2
- 점수 : 12
- 문제 링크
문제
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고) 문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.
제한사항
– s는 길이 1 이상 200 이하인 문자열입니다.
– s는 알파벳과 숫자, 공백문자(“ “)로 이루어져 있습니다.
– 숫자는 단어의 첫 문자로만 나옵니다.
– 숫자로만 이루어진 단어는 없습니다.
– 공백문자가 연속해서 나올 수 있습니다.
입출력예시
s | return |
---|---|
“3people unFollowed me” | “3people Unfollowed Me” |
“for the last week” | “For The Last Week” |
풀이 코드
나의 풀이 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public String solution(String s) {
String answer = "";
String[] sArray = s.split("");
int nextIsUpperFlag = 1;
for (int i = 0; i < sArray.length; i++) {
if (sArray[i].equals(" ")) {
// 공백이면 flag를 1로 변환하고 pass 한다.
nextIsUpperFlag = 1;
answer += sArray[i];
} else if (nextIsUpperFlag == 1) {
// 공백이 아니고 flag가 1이면 문자를 uppercase로 변환하고 flag를 0으로
nextIsUpperFlag = 0;
answer += sArray[i].toUpperCase();
} else {
// 공백이 아니고 flag가 0이면 lowercase로 변환한다.
answer += sArray[i].toLowerCase();
}
}
return answer;
}
다른 풀이 코드
풀이 코드 중, 풀이 방식은 비슷하나 삼항연산자를 이용해 짧게 작성한 코드가 있어 첨부한다.
1
2
3
4
5
6
7
8
9
10
11
12
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 이용
코드 참조
문자 다루기
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
// 문자를 나누기 : split()
String testString = "Hello World!";
System.out.println(Arrays.toString(testString));
>> [H, e, l, l, o, , W, o, r, l, d, !]
// 영문자를 대문자로 변경 : toUpperCase()
// -- 공백, 숫자, 한글 등에도 사용 가능하나 변화는 없다.
String testString = "Hello World!";
System.out.println(testString.toUpperCase());
>> "HELLO WORLD!"
// 영문자를 소문자로 변경 : toLowerCase()
// -- 공백, 숫자, 한글 등에도 사용 가능하나 변화는 없다.
String testString = "Hello World!";
System.out.println(testString.toLowerCase());
>> "hello world!"
// 문자가 같은지 비교 : equals()
System.out.println("abc".equals("abc"));
>> True
// 문자열 양 끝의 공백 제거 : strip()
System.out.println(" Hello World! ".strip());
>> "Hello World!"
// 배열 문자화 : Arrays.toString()
String testString = "Hello World!";
System.out.println(Arrays.toString(testString));
>> [H, e, l, l, o, , W, o, r, l, d, !]
리뷰
처음엔 문장을 공백 기준으로 나눈 뒤 나눠진 각 단어들을 대문자처리 후 공백을 사이사이에 끼워 붙여줬다. 그리고 마무리는 strip()으로 양 끝의 공백을 제거해줬다. 그런데 이게 문제였다.
테스트케이스 8번의 경우 문자열 앞 뒤로 공백이 있는데, 이 공백은 보존해줘야 하기 때문에 strip()을 사용하면 오답이 되어버린다. 때문에 문제 해결 방식을 바꾸어 각 문자를 검사하는 방식으로 바꾸었다.
Reference
대문자 소문자 전환 : https://pridiot.tistory.com/24
문자열 자르기 split : https://jamesdreaming.tistory.com/84
배열 길이 : https://mine-it-record.tistory.com/126
문자열 공백 제거 : https://hianna.tistory.com/526
특정 문자 포함 여부 : https://hianna.tistory.com/539
배열 값 출력하기 : https://hianna.tistory.com/510