Light Blue Pointer
본문 바로가기
Coding Test

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

by Greedy 2024. 1. 8.

문제 주소

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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"

※ 공지 - 2022년 1월 14일 제한 조건과 테스트 케이스가 추가되었습니다.

 

⭐how to know if a character is lowercase

Character.isLowerCase('c');

⭐how to convert lowercase to uppercase

Character.toUpperCase(f);

⚠️주의할 점은 저거 하고 다시 넣어줘야 한다는거다 substring같이

char c = s.charAt(0);
Character.toUpperCase(c); -> 바뀐게 c에 저장이 안 됨
c = Character.toUpperCase(c); -> 넣어줘야 함!
테스트 1
입력값 〉	"3people unFollowed me"
기댓값 〉	"3people Unfollowed Me"
실행 결과 〉	실행한 결괏값 "3people UnFollowed Me"이 기댓값 "3people Unfollowed Me"과 다릅니다.
테스트 2
입력값 〉	"for the last week"
기댓값 〉	"For The Last Week"
실행 결과 〉	테스트를 통과하였습니다.

테스트 1 어이없다

아무튼 matches로 걸러내봄

class Solution {
    public String solution(String str) {
        String answer = "";
        String [] array = str.split(" ");
        for(String s : array){
            
            char c = s.charAt(0);
            if(!Character.toString(c).matches("[0-9]")){
                if(Character.isLowerCase(c)){
                    c = Character.toUpperCase(c);
                }
            }
   
            answer = answer + c + s.substring(1,s.length())+ " ";
            
        }
        answer = answer.substring(0,answer.length()-1);
        return answer;
    }
}
테스트 1
입력값 〉	"3people unFollowed me"
기댓값 〉	"3people Unfollowed Me"
실행 결과 〉	실행한 결괏값 "3people UnFollowed Me"이 기댓값 "3people Unfollowed Me"과 다릅니다.
테스트 2
입력값 〉	"for the last week"
기댓값 〉	"For The Last Week"
실행 결과 〉	테스트를 통과하였습니다.

? 3이 문제가 아닌가봄 뭐가 다른건지 모르겠음…

실행한 결괏값 "3people UnFollowed Me"이

기댓값 "3people Unfollowed Me"과 다릅니다.

아 followed가 뜬금없이 왜 대문자가 됐죠

음.. 모르겠어서 하나하나 읽어서 공백 다음글자만 하기로 함

class Solution {
    public String solution(String s) {
        
        String answer = "";
        boolean wasBlank = true;
        
        for(int i=0; i<s.length(); i++){
            char c = s.charAt(i);
            if(wasBlank){
                if(Character.isLowerCase(c)){
                    c = Character.toUpperCase(c);
                }
                wasBlank = false;
            }
            
            if(c == ' '){
               wasBlank = true; 
            }
            
            answer = answer + c;
        }
   
         return answer;   
    }
}
테스트 1
입력값 〉	"3people unFollowed me"
기댓값 〉	"3people Unfollowed Me"
실행 결과 〉	실행한 결괏값 "3people UnFollowed Me"이 기댓값 "3people Unfollowed Me"과 다릅니다.

아 다시보니 입력값이 이미 대문자다

소문자로 바꿔줘야하나봄

class Solution {
    public String solution(String s) {
        
        String answer = "";
        boolean wasBlank = true;
        
        for(int i=0; i<s.length(); i++){
            char c = s.charAt(i);
            if(wasBlank){
                if(Character.isLowerCase(c)){
                    c = Character.toUpperCase(c);
                }
                wasBlank = false;
            }else{
                if(c == ' '){
               wasBlank = true; 
                }
                else if(Character.isUpperCase(c)){
                    c = Character.toLowerCase(c);
                }
            }

            answer = answer + c;
        }
   
         return answer;   
    }
}
테스트 1
입력값 〉	"3people unFollowed me"
기댓값 〉	"3people Unfollowed Me"
실행 결과 〉	테스트를 통과하였습니다.
테스트 2
입력값 〉	"for the last week"
기댓값 〉	"For The Last Week"
실행 결과 〉	테스트를 통과하였습니다.
테스트 1 〉	통과 (10.95ms, 87.9MB)
테스트 2 〉	실패 (10.70ms, 78.5MB)
테스트 3 〉	통과 (12.50ms, 75.6MB)
테스트 4 〉	실패 (9.12ms, 76.3MB)
테스트 5 〉	통과 (14.03ms, 82.9MB)
테스트 6 〉	통과 (13.14ms, 74.7MB)
테스트 7 〉	통과 (11.06ms, 75.6MB)
테스트 8 〉	통과 (8.83ms, 80.9MB)
테스트 9 〉	통과 (10.62ms, 83.5MB)
테스트 10 〉	통과 (14.81ms, 80MB)
테스트 11 〉	실패 (9.89ms, 64.7MB)
테스트 12 〉	실패 (9.49ms, 77.1MB)
테스트 13 〉	실패 (10.01ms, 87MB)
테스트 14 〉	실패 (10.34ms, 80.4MB)
테스트 15 〉	통과 (11.92ms, 78.1MB)
테스트 16 〉	통과 (10.74ms, 74.3MB)
테스트 17 〉	통과 (11.30ms, 74.8MB)
테스트 18 〉	통과 (9.39ms, 68.8MB)

왜죠

공백이 계속 나오거나 하면 이상해지나 싶고 이중 if문 더러운거 같아서 코드 정리했더니 통과됨

 

제출 코드

class Solution {
    public String solution(String s) {
        
        String answer = "";
        boolean isFirst = true;
        
        for(int i=0; i<s.length(); i++){
            char c = s.charAt(i);
            
            if(c == ' '){
               isFirst = true; 
            }else if(isFirst){
                if(Character.isLowerCase(c)){
                    c = Character.toUpperCase(c);
                }
                isFirst = false;
            }else if(Character.isUpperCase(c)){
                c = Character.toLowerCase(c);    
            }
            answer = answer + c;
        }
   
         return answer;   
    }
}
테스트 1 〉	통과 (39.02ms, 86MB)
테스트 2 〉	통과 (9.86ms, 75.5MB)
테스트 3 〉	통과 (13.26ms, 69.7MB)
테스트 4 〉	통과 (13.75ms, 75.7MB)
테스트 5 〉	통과 (10.91ms, 75.9MB)
테스트 6 〉	통과 (11.98ms, 76.1MB)
테스트 7 〉	통과 (13.43ms, 85.6MB)
테스트 8 〉	통과 (11.80ms, 85.5MB)
테스트 9 〉	통과 (9.85ms, 79.5MB)
테스트 10 〉	통과 (13.88ms, 76.6MB)
테스트 11 〉	통과 (13.94ms, 76.3MB)
테스트 12 〉	통과 (9.96ms, 79MB)
테스트 13 〉	통과 (11.46ms, 79MB)
테스트 14 〉	통과 (12.47ms, 77.3MB)
테스트 15 〉	통과 (12.06ms, 76.5MB)
테스트 16 〉	통과 (9.40ms, 72.1MB)
테스트 17 〉	통과 (9.23ms, 73.4MB)
테스트 18 〉	통과 (12.35ms, 76.8MB)