알고리즘 공부/프로그래머스 문제풀이

[프로그래머스] JadenCase 문자열 만들기 (JAVA)

송테이토 2022. 11. 20. 01:14

문제 설명

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.

제한 조건
  • s는 길이 1 이상 200 이하인 문자열입니다.
  • s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
    • 숫자는 단어의 첫 문자로만 나옵니다.
    • 숫자로만 이루어진 단어는 없습니다.
    • 공백문자가 연속해서 나올 수 있습니다.
입출력 예sreturn
"3people unFollowed me" "3people Unfollowed Me"
"for the last week" "For The Last Week"

 

----

정답 

  • " " 공백문자가 여러개 올경우 split의 경우 오류가 발생합니다 tokenizer의 true 로 사용하시는 걸 추천드립니다.

StringTokenizer(String str, String delim, boolean flag) : flag는 구분자 자체도 토큰으로 인식하게 할지 여부를 정한다. 예를 들어 true라면 "Hi I'm Song!!"는 공백을 포함하여"HI", " ", "I'm", " ", "Song!!" 이렇게 5개의 토큰으로 파싱 된다.

import java.util.*;
class Solution {
 
    
    public String solution(String s) {
    
    s = s.toLowerCase(); //처음부터 다 소문자로 바꿔버리기

		StringTokenizer st = new StringTokenizer(s, " ", true);
		StringBuilder sb = new StringBuilder();
		while (st.hasMoreTokens()) {
			String word = st.nextToken();
			// 만약 단어가 공백이면 그대로 출력해주고
			if (word.equals(" "))
				sb.append(word);
			else { //아니라면 첫글자 대문자 변환해주기
				sb.append(word.substring(0, 1).toUpperCase() + word.substring(1));
			}
		}
		return sb.toString();
	}

}

 

다른 풀이법

class Solution {
    public String solution(String s) {
String answer = "";
		String[] words = s.toLowerCase().split("");
		
		boolean flag = true;
		
		for (String word : words) {
			answer += flag ? word.toUpperCase() : word;
			flag = word.equals(" ") ? true : false;
		}

		return answer;
	}
}

 

 

 

 

 

JadenCase 문자열 만들기 자바 런타임에러

첫 시도 - 틀린코드

class Solution {
    public String solution(String s) {

		String[] arr = s.toLowerCase().split(" ");

		String answer = "";
		for (int i = 0; i < arr.length; i++) {
			String change = arr[i].substring(0, 1).toUpperCase() + arr[i].substring(1)+ " ";
			answer += change;

		}
		answer = answer.substring(0, answer.length() - 1);
		return answer;
	}

}

 

어어어..? 런타임에러뭔데....

두번째 시도 - 그러나 또 틀린 코드

class Solution {
    public String solution(String s) {
String[] arr = s.toLowerCase().split(" ");

		String answer = "";
		for (int i = 0; i < arr.length; i++) {
			String first_toUpper = String.valueOf(Character.toUpperCase(arr[i].charAt(0)));
			String change = first_toUpper + arr[i].substring(1) + " ";
			answer += change;

		}
		answer = answer.substring(0, answer.length() - 1);
		return answer;
	}
}

 

찾아보니 split을 쓰며 당연하게 공백이 한개만 들어온다고 생각해서 그런 것 같다.

문제를 잘 읽자

Tip. 공백이 한번만 나온다는 말은 어디에도 없지만 당연하게 공백이 단어 사이에 하나만 존재할것이라 생각하고 공백으로 파싱하거나하는 실수

  •