문제 설명

문제 출처

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다.

문자열 s가 주어졌을 때, sJadenCase로 바꾼 문자열을 리턴하는 함수 Solution을 만들어주세요

제한 사항

  • s는 길이 1 이상인 문자열입니다.

  • s는 알파벳과 공백문자(“ “)로 이루어져 있습니다.

  • 첫 문자가 영문이 아닐 때에는 이어지는 영문은 소문자로 씁니다.

예제 입출력

s return
“3people unFollowed me” “3people Unfollowed Me”
“for the last week” “For The Last Week”

Solution

문제 지문 자체가 애매하고 지문과 테스트케이스 사이에 모순이 존재하기 때문에 고생시키는 문제이다.

위 조건에서 몇 가지 설명을 추가하겠다.

  1. 공백 문자두 개 이상이 올 수 있다. 즉, "Hello World", "Hello      World" 둘 모두 입력 문자열로 가능하다.

  2. 문제 조건에서는 분명 알파벳, 공백문자라고 언급하였지만 테스트케이스에서는 3people과 같이 숫자가 올 수 있다.

  3. 연속한 공백 문자의 경우 이어지는 영문을 소문자로 쓸 것인가, 대문자로 쓸 것인가. 분명 제한사항으로는 첫 문자가 영문이 아닐 시 이어지는 영문은 소문자라고 하였다. 그렇다면 "hello     world"의 경우 "Hello     World"가 반환되어야 하는가? "Hello     world"가 반환되어야 하는가? 정답부터 이야기 하자면 전자 ("Hello     World")가 반환되어야 정답처리가 된다.

지문과 테스트케이스가 부족한 감이 있기 때문에 혼란을 방지하기 위해 위 조건들을 추가하였다.

사실 문제 자체는 상당히 간단하다. 연속된 공백 문자에 대하여 어떻게 처리할지만 조금 고민해본다면, 레벨 1수준의 쉬운 문제이다.

나 같은 경우는 사실 처음 풀었을 때와 2달의 시간이 흐른 지금 풀었을 때 접근법이 아예 다르다.

첫 번째 접근법 - 문자열 연산

자바가 제공해주는 String 관련 API를 사용한다.

공백 문자의 위치(인덱스)를 별도로 저장하고, 문자열을 공백을 기준으로 split하여 문자열 배열을 얻는다.

그런 다음 문자열 배열을 trim() 연산으로 앞 뒤 공백을 제거하고 맨 첫 글자를 toUpperCase 연산을 한다.

마지막으로 문자열들을 이어 붙인 뒤, 처음 저장한 공백 문자 인덱스를 저장한 자료구조를 이용하여 다시 삽입해주면 끝이난다.

두 번째 접근법

두 번째 접근법은 별도의 String API를 사용하지 않는다.

하나의 문자열에 대해서 연산하는 것이기 때문에 Queue 또는 Stack을 이용한 문제해결로 접근하는 것이 편리하다.

입력 문자열을 모두 소문자로 치환해준다.

그리고 문자열을 구성하는 문자 배열의 요소 하나하나를 검사한다. 만일 현재 추출한 문자가 알파벳이고 직전 문자가 공백 문자였다면 대문자로 치환하여 삽입한다. 이 외의 조건이라면 변경하지 않는다.

즉, 직전 문자가 공백이었는지 검사만 함으로써 단 하나의 loop로 간단하게 연산이 가능하다.


Code


몇줄 평

다른 프로그래머스 문제에 비하여 질이 좀 떨어지는 것 같다.

2달 전과 코드 접근법에 대해 더 생각하는 자세가 생김. (큐, 스택과 같은 자료구조 활용 가능 여부에 대해서 고민)


2020-04-16 일자로 코드 일부 수정 (로직 다름)

참고 및 출처