[Study] 프로그래머스 lv.2 JadenCase 문자열 만들기

ayboori·2023년 6월 19일
0

Java Study

목록 보기
4/34

1 - 실수한 코드

풀이 로직

문자열 추가, 삭제가 잦으니까 StringBuffer을 사용해보자

  1. 공백 문자를 기준으로 문자열을 분리한다

  2. 문자열의 첫번째 글자를 가져온다
    2-1. 첫번째 글자가 알파벳이 맞는지, 아닌지 체크한다
    2-2. 알파벳이 맞을 경우 대문자로 변경 / 아닐 경우 아무것도 변경하지 않는다

  3. 나머지 문자열을 가져온뒤, 모두 소문자로 변경한다

  4. 첫번째 문자열 + 나머지 문자열 + 공백으로 문자열을 완성한다
    3-1. 이때 다음 문자열이 없을 때는 공백을 추가하지 않는다.

사용한 함수

string.split("구분열") : 구분열을 기준으로 문자열을 분리하여 string 배열에 삽입
str.substring(시작,끝) : 시작 번째 인덱스부터 끝 번째 인덱스까지의 string을 리턴
str.toUpperCase : String 문자열을 전부 대문자로 변경

문자열인지 확인 - 함수 직접 작성

내가 작성한 코드

class Solution {
    public StringBuilder solution(String s) {
        String[] Arraystr = s.split(" "); // 문자열 분리
        StringBuilder answer = new StringBuilder();
        
        for (int i =0; i<Arraystr.length ; i++){ // 문자열의 길이만큼 루프
            String a = Arraystr[i];
            answer.append(upperFirstChar(a)); // 함수 적용 후 정답에 부착
            if(i != Arraystr.length -1){ // 마지막 문자열이 아니라면 공백 삽입
                answer.append(" ");
            }
        }
        
        return answer;
    }
    
    public String upperFirstChar(String a){ // 분리된 문자열의 첫 글자를 대문자로 변경하는 함수
            String firstA = a.substring(0,1);
            String secondA = a.substring(1, a.length());
            String finalA;
            
            if(isAlpha(firstA)){ // 첫번째 문자열이 알파벡이라면
                finalA = firstA.toUpperCase() + secondA.toLowerCase(); // 대문자로 변경하여 부착
            } else{
                 finalA = firstA + secondA.toLowerCase(); // 아닐 경우 그냥 부착
            }
            return finalA;
        
    }
    
    public boolean isAlpha(String s){ // 문자열이 알파벳으로만 이루어져있는지 확인
        return s != null && s.chars().allMatch(Character::isLetter);
    }
}

실패한 이유

split 함수

중간의 공백이 여러개가 있을 때에도 모두 구분자로 취급하여 삭제한다

"A    B  C"
return값 = {"A","B","C"}

수정해야 할 부분

flag 사용해보기

스터디원들의 경우, flag를 설정하여 다음에 올 문자열이 공백 뒤에 온 것인지 확인 후 대문자로 변경하는 로직을 사용했다.

소문자 변경 로직 수정해보기

처음에 모든 문자열을 소문자로 변경해둔 뒤, 공백 뒤의 첫 글자만 대문자로 바꾸는 것이 쓸모없는 로직을 줄일 수 있다는 것을 알았다!

charAt(n) 사용

문자열 하나하나를 읽어와 비교하는 방식으로 사용한 함수이다.

length / length() 구분

참고

  • length : 배열의 길이
  • length() : 문자열의 길이

2 - 수정한 코드

StringBuilder에 char 부착

참고

1) answer.append(s.charAt(i).toUpperCase();

StringBuilder에는 char 타입을 붙일 수 없다.

2) answer.append(s.charAt(i).toUpperCase().toString());

char 같은 기본 타입에는 toString(), equals() 등의 함수를 사용할 수 없다.

3) answer.append(Character.toUpperCase(s.charAt(i)));

character 객체의 함수를 사용해야 char > String 변환이 가능하다.

알파벳인지는 검사할 필요가 없다!

toUpperCase / toLowerCase는 알파벳이 아닐 경우 그냥 원래의 입력값을 리턴한다.

내가 작성한 코드

class Solution {
            public StringBuilder solution(String s) {
                StringBuilder answer = new StringBuilder();
                boolean flag = true; // 공백 이후의 첫번째 문자열인지 확인하는 함수

                for (int i = 0 ; i < s.length(); i++){
                    if(flag){ // 앞의 문자열이 공백이었으면
                        answer.append(Character.toUpperCase(s.charAt(i))); // 대문자로
                    }else{ // 아니면
                        answer.append(Character.toLowerCase(s.charAt(i))); // 소문자로
                    }

                    if(s.charAt(i) == ' '){
                        flag = true;
                    }else{
                        flag = false;
                    } // 현재 문자열 공백인지 아닌지에 따라 다음의 플래그 세팅
                }
                return answer;
            }
        }

다른 사람의 코드

class Solution {
  public String solution(String s) {
        String answer = "";
        String[] sp = s.toLowerCase().split("");
        boolean flag = true;

        for(String ss : sp) {
            answer += flag ? ss.toUpperCase() : ss;
            flag = ss.equals(" ") ? true : false;
        }

        return answer;
  }
}
  • split을 사용하긴 했지만, 문자열을 하나씩 끊는 방법으로 사용했다.
  • 한 번에 모든 문자열을 lower로 만들어두고 시작했다.
  • flag 검사를 삼항 연산자를 사용했다.

Matcher 클래스를 사용하신 분도 봤다.
스터디원의 설명 참고하여 추후 학습하자!

profile
프로 개발자가 되기 위해 뚜벅뚜벅.. 뚜벅초

0개의 댓글