티스토리 뷰

코테 공부를 다시 시작했다.. 

 

프로그래머스에서 2단계 문제부터 차근차근 풀어보고자 한다. 파이팅..!

 

JadenCase 문자열 만들기라는 문제는 문자열의 대소문자를 구분하고 이를 조건에 맞게 바꿔줘야 한다.

 

주로 사용되는 함수는 대소문자 여부 확인과 변경시켜주는 함수.

 

Character.isUpperCase(charArr[0]);

charArr[0]이 대문자인지 확인하는 함수다.

true/false로 반환되며 대문자일 경우 true, 그 외에는(int, 특수문자 포함) false로 반환된다.

 

소문자인지 확인하고 싶다면 

Character.isLowerCase()

 

charArr[0]을 대문자로 변경하고 싶다면

Character.toUpperCase(charArr[0]);

를 사용하면 된다. 소문자는 대문자로 변경시켜주고, int나 특수문자는 그대로 둔다.


소문자 또한 마찬가지로

Character.toLowerCase();를 사용하면 된다.

 

후에 나올 함수지만 

Character.isLetter(charArr[0]);

이건 charArr[0]가 문자인지 확인하는 함수이다. 문자라면 true를, 아니라면 false를 반환한다. 

 

 

처음 생각한 거는

 

1. 문자열을 공백을 기준으로 나누고

2. 0번째 오는 문자열이 대문자인지 확인 후

2-1. 대문자가 아니라면 대문자로 변경

3. 그 뒤에 오는 문자는 다 소문자로 변경

 

class Solution {
    public String solution(String s) {
        String answer = "";
        
        String[] str = s.split(" ");
        
        for(int i = 0; i < str.length; i++){
            char[] charArr = str[i].toCharArray();
            
            if(!Character.isUpperCase(charArr[0])) //첫 번째 문자 대문자 여부 확인
                charArr[0] = Character.toUpperCase(charArr[0]);
            
            for(int j = 1 ; j < charArr.length; j++){ //그 다음으로 오는 문자 소문자로 변경
                charArr[j] = Character.toLowerCase(charArr[j]);
            }
            str[i] = new String(charArr);
            
            if(i < str.length -1 ){
                answer += str[i] + " ";
            }else{
                answer += str[i]; // 마지막일 경우 공백 x
            }
        }
        return answer;
    }
}

 

이었다. 테스트케이스는 성공했지만 제출하고 보니 런타임 오류가 발생했다.

 

이유는 제한 조건인 "공백 문자가 연속해서 나올 수 있습니다." ..ㅠ

연속해서 공백이 오는 경우 str[i]에 빈 문자열이 들어가 StringIndexOutOfBoundsException가 발생하는 것이었다.

 

하여 연속해서 공백이 들어오는 경우도 포함하여 알고리즘을 다시 짜기 시작했다.

 

1. 첫 문자 판별을 위해 boolean을 하나 만들어주고

2. 공백을 기준으로 나누지 않고 처음부터 char[]로 바꾼 뒤

3. ch[0]가 공백이라면 다음에 오는 글자는 첫 문자라고 판별 start를 true로 바꿔준다.

3-1. 첫 문자이고, 문자라면 대문자로 변경

(처음에는 대문자 여부로 확인했었지만 숫자면 변환되는 것이 없어 문자인지 판별하고 바꾸는 게 더 나을 것이라고 생각했다.)

3-2. 그 외에는 모두 소문자로 변경

4. start false로 바꿔주기

class Solution {
    public String solution(String s) {
        boolean start = true;
        
        char[] ch = s.toCharArray();
        
        for(int i=0;i<ch.length;i++){
            if(ch[i] == ' '){
                start = true;
            }else{
                if(start && Character.isLetter(ch[i])){
                    ch[i] = Character.toUpperCase(ch[i]);
                }else{
                    ch[i] = Character.toLowerCase(ch[i]);
                }
                start = false;
            }
        }
        
        return new String(ch);
    }
}

 

 

다행이 런타임 오류 없이 성공했다.