https://school.programmers.co.kr/learn/courses/30/lessons/12951#

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제

문제 설명
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"


문제 해결을 위한 과정

 

처음 이 문제를 처음 접할 때 s.split(" ")을 이용해 단어 배열을 만들고 접근하였고 Fail판정을 받았습니다. 그 이유는 다음과 같습니다.

  1. 공백이 연속으로 나오는 경우: "3people    unFollowed me"처럼 단어 사이에 공백이 여러 개일 때
  2. 문자열 마지막에 공백이 있는 경우: 자바의 기본 split은 문자열 맨 끝에 붙은 공백들을 무시하고 잘라버리기 때문에 원래 문자의 형태를 훼손합니다.

따라서 이 문제를 풀기 위해서는 문자열을 한 글자씩(charAt) 순회하면서 직접 처리해야 합니다.

 

문자열을 한 바퀴 돌면서 아스키코드(ASCII) 값을 기준으로 대소문자를 판별합니다.

  1. 맨 첫 글자 (i == 0): 무조건 대문자가 되어야 하는 자리입니다. 소문자 범위(97 ~ 122)라면 아스키값에서 32를 빼서 대문자로 변환하고, 그 외(숫자나 대문자)라면 그대로 둡니다.
  2. 그 외의 글자들 (i > 0):
    • 내 앞 글자가 공백(" ")인 경우: 새로운 단어의 시작점입니다. 즉, 대문자가 되어야 합니다. 현재 글자가 소문자라면 대문자로 바꾸고(num - 32), 원래 대문자나 숫자였다면 건드리지 않고 그대로(num) 붙여줍니다.
    • 내 앞 글자가 공백이 아닌 경우: 단어의 중간이나 끝에 끼어있는 글자들입니다. JadenCase 규칙상 첫 글자를 제외하곤 무조건 소문자여야 하므로, 대문자 범위(65 ~ 90)인 글자를 발견하면 32를 더해 소문자로 강제 변환합니다.

소스코드
import java.util.*;

class Solution {
    public String solution(String s) {
        String answer = "";
        
        for(int i = 0; i < s.length(); i++) {
            int num = s.charAt(i) + 0;
            if(i == 0) { // 처음
                if(num >= 97 && num <= 122) {
                    answer += (char)(num - 32);
                } else {
                    answer += (char)num;
                }
            } else { // 그 외
                if((" ").equals(String.valueOf(s.charAt(i-1)))) {
                    if(num >= 97 && num <= 122)
                        answer += (char)(num - 32);
                    else
                        answer += (char)(num);
                } else if(num >= 65 && num <= 90)
                    answer += (char)(num + 32);
                else {
                    answer += (char)num;
                }
            }
        }
        return answer;
    }
}

+ Recent posts