문제 설명
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다.
문자열 s
가 주어졌을 때, s
를 JadenCase
로 바꾼 문자열을 리턴하는 함수 Solution을 만들어주세요
제한 사항
-
s
는 길이 1 이상인 문자열입니다. -
s
는 알파벳과 공백문자(“ “)로 이루어져 있습니다. -
첫 문자가 영문이 아닐 때에는 이어지는 영문은 소문자로 씁니다.
예제 입출력
s | return |
---|---|
“3people unFollowed me” | “3people Unfollowed Me” |
“for the last week” | “For The Last Week” |
Solution
문제 지문 자체가 애매하고 지문과 테스트케이스 사이에 모순이 존재하기 때문에 고생시키는 문제이다.
위 조건에서 몇 가지 설명을 추가하겠다.
-
공백 문자
는두 개 이상
이 올 수 있다. 즉,"Hello World"
,"Hello World"
둘 모두 입력 문자열로 가능하다. -
문제 조건에서는 분명
알파벳, 공백문자
라고 언급하였지만 테스트케이스에서는3people
과 같이 숫자가 올 수 있다. -
연속한 공백 문자
의 경우 이어지는 영문을소문자
로 쓸 것인가,대문자
로 쓸 것인가. 분명 제한사항으로는 첫 문자가영문이 아닐 시 이어지는 영문은 소문자
라고 하였다. 그렇다면"hello world"
의 경우"Hello World"
가 반환되어야 하는가?"Hello world"
가 반환되어야 하는가? 정답부터 이야기 하자면 전자 ("Hello World"
)가 반환되어야 정답처리가 된다.
지문과 테스트케이스가 부족한 감이 있기 때문에 혼란을 방지하기 위해 위 조건들을 추가하였다.
사실 문제 자체는 상당히 간단하다. 연속된 공백 문자
에 대하여 어떻게 처리할지만 조금 고민해본다면, 레벨 1수준의 쉬운 문제이다.
나 같은 경우는 사실 처음 풀었을 때와 2달의 시간이 흐른 지금 풀었을 때 접근법이 아예 다르다.
첫 번째 접근법 - 문자열 연산
자바가 제공해주는 String
관련 API를 사용한다.
공백 문자의 위치(인덱스)
를 별도로 저장하고, 문자열을 공백을 기준으로 split
하여 문자열 배열을 얻는다.
그런 다음 문자열 배열을 trim()
연산으로 앞 뒤 공백을 제거하고 맨 첫 글자를 toUpperCase
연산을 한다.
마지막으로 문자열들을 이어 붙인 뒤, 처음 저장한 공백 문자 인덱스를 저장한 자료구조를 이용하여 다시 삽입해주면 끝이난다.
두 번째 접근법
두 번째 접근법은 별도의 String API
를 사용하지 않는다.
하나의 문자열에 대해서 연산하는 것이기 때문에 Queue
또는 Stack
을 이용한 문제해결로 접근하는 것이 편리하다.
입력 문자열을 모두 소문자로 치환해준다.
그리고 문자열을 구성하는 문자 배열
의 요소 하나하나를 검사한다. 만일 현재 추출한 문자가 알파벳
이고 직전 문자가 공백 문자
였다면 대문자
로 치환하여 삽입한다. 이 외의 조건이라면 변경하지 않는다.
즉, 직전 문자가 공백이었는지 검사
만 함으로써 단 하나의 loop
로 간단하게 연산이 가능하다.
Code
몇줄 평
다른 프로그래머스 문제에 비하여 질이 좀 떨어지는 것 같다.
2달 전과 코드 접근법에 대해 더 생각하는 자세가 생김. (큐, 스택과 같은 자료구조 활용 가능 여부에 대해서 고민)