[코딩테스트]프로그래머스 - JadenCase 문자열 만들기

Adela·2020년 5월 24일
0

프로그래머스

목록 보기
21/30
post-thumbnail

JadenCase 문자열 만들기

문제 설명

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다.
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.

제한 조건

  • s는 길이 1 이상인 문자열입니다.
  • s는 알파벳과 공백문자(" ")로 이루어져 있습니다.
  • 첫 문자가 영문이 아닐때에는 이어지는 영문은 소문자로 씁니다. ( 첫번째 입출력 예 참고 )

입출력 예

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

해결한 나의 코드

function solution(s){
  var answer = ''
  var temp = s.toLowerCase().split('')
  for(var i=0; i<temp.length; i++){
    var check_eng = /[a-zA-Z]/
    if(check_eng.test(temp[i])){
      temp[0] = temp[0].toUpperCase()
      if(temp[i-1] == ' '){
        temp[i] = temp[i].toUpperCase()
      }
    }
  }
  answer = temp.join('')
  return answer
}

나의 알고리즘

먼저 연속된 공백이 있을 수 있다는 예외사항을 생각해주어야 한다.
나는 이 부분을 생각하지 못해서 몇 번의 실패를 맛봐야 했다 ㅠㅠ

출처 - 질문하기

문제 풀이 시 체크 사항(조건)

지문이 조금 애매하고 제한된 테스트케이스로 저와같이 헷갈려하시는 분들이 많아 몇 가지 체크사항을 말씀드리겠습니다.

제한 조건에는 주어진 문자열 s가 영문자와 공백으로 이루어져있다고 했지만 테스트케이스 예시에는 숫자가 포함되는(3people)경우가 있습니다. 저 같은 경우 그냥 모든 문자가 가능 하다고 가정하고 풀었습니다. (실제로 문제 풀이에는 큰 영향을 미치지 않았습니다.)

연속된 공백이 가능합니다. 예를 들면 Hello(공백)World, Hello(공백)(공백)World가 가능합니다.

제가 가장 헷갈렸던 부분입니다. 제한조건에서는 첫 문자가 영문자가 아닐 경우 이어지는 영문은 소문자로 씁니다. 라고 하여 만일 연속된 공백으로 이루어진 문자열이 있을 때, 이 연속된 공백도 문자로 봐야할 것인지의 문제입니다.

즉, 두개의 문자열 사이에 공백이 연속되는 경우, 연속된 공백을 어떻게 바라보느냐에 따라 이어지는 문자열의 시작을 대문자로 할지 소문자로 할지 애매합니다.

예를들면 hello(공백)my(공백)(공백)friend 라는 문자가 들어왔다고 가정 할 때, 이 문자열을 Hello(공백)My(공백)(공백)Friend로 치환해야 할지, Hello(공백)My(공백)(공백)friend로 치환해야 할지 애매하다는 겁니다. 여기서 연속된 공백문자로 바라보지 않습니다. 즉, 전자와 같이 출력해야 원하는 결과를 얻으 실 수 있습니다. (저는 후자와 같이 출력하게끔 문제를 풀어서 코드 문제인지 개고생했네요)

따라서 나의 알고리즘은 다음과 같다.

  1. s로 들어온 모든 문자열을 소문자로 바꾼 후 split 하여 배열로 만든다.
  2. 영문자의 경우에만 대문자로 바꿔주어야 하니까
    2-1. 영문자 체크를 한다.
    2-2. 영문자가 맞고 만약 배열의 첫 번째 원소라면 무조건 대문자여야 하니까 대문자로 바꾼다.
    2-3. 영문자가 맞고 만약 이전에 있는 원소가 공백이었다면 이 원소는 단어의 첫 문자가 되니까 대문자로 바꾼다.
  3. 이를 join하여 answer에 담아 반환한다.
    이렇게하면, 기존의 공백 조건도 무너지지 않으면서 단어의 첫 문자만 대문자로 바꾼 채 return할 수 있게 된다.

사실 나는 연속된 공백을 생각하지 못해 공백을 기준으로 split을 시도했다.
그래서 예제 테스트는 통과하는데, 채점해서 무수한 실패를 만났다 ㅜㅜ... 질문하기 글을 보지 않았으면 풀지 못했을 것 !

s의 공백 위치와 개수를 지키면서 단어의 첫 문자만 대문자로 바꾸는 방법에 대해 또 은근히 복잡하게 생각했다. 좀 더 단순히 사고하는 능력을 기르자 ! ㅜ_ㅜ

profile
개발 공부하는 심리학도

0개의 댓글