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개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN