been_dev
been_archive
been_dev
전체 방문자
오늘
어제
  • 분류 전체보기 (34)
    • f-lab (3)
    • project (2)
    • solve (29)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • f-lab
  • Downloading from external resources is disabled
  • Lombok
  • 탐욕법
  • 스택
  • 숫자의표현
  • specify location
  • 실행창 작음
  • 에프랩
  • 코딩테스트
  • f-lab 2개월 후기
  • 큐
  • 그리디
  • Eclipse
  • 버튼미노출
  • 자바
  • 해시
  • 후기
  • 문자열
  • 프로그래머스
  • 자바 백엔드
  • 에프랩 2개월 후기
  • f-lab 1개월 후기
  • jadencase만들기
  • 완전탐색
  • 에프랩 1개월 후기
  • 이진변환반복하기
  • JWT
  • MYSQL
  • 백준

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
been_dev

been_archive

solve

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

2024. 10. 30. 11:43

 

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

 

 문제 설명

 JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다.

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


제한 조건

s는 길이 1 이상 200 이하인 문자열입니다.
s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
숫자는 단어의 첫 문자로만 나옵니다.
숫자로만 이루어진 단어는 없습니다.
공백문자가 연속해서 나올 수 있습니다.

첫번째 코드 (실패)

단순하게 공백 문자 기준으로 문자열을 자르고, char 배열로 만들어서 인덱스가 0인 경우와 아닌 경우로 첫 문자를 구분하려고 했다. 문자를 치환한 뒤에는 공백 문자를 붙여서 다시 문자열로 만들었다. 제한 조건을 제대로 파악하지 않아서(...) 연속된 공백을 고려하지 않았다는 문제가 있다.

더보기

첫번째 코드

private static String old_solution(String s) {

        StringBuilder answer = new StringBuilder();

        // 공백으로 자르기
        String[] strArr = s.split(" ");
        for(int i=0; i < strArr.length; i++) {
            // 처음과 끝이 공백이거나, 연속한 공백 문자인 경우
            if(strArr[i].isBlank()) {
                answer.append(strArr[i]);
                continue;
            }

            char[] chArr = strArr[i].toCharArray();
            for(int j=0; j< chArr.length; j++) {
                char ch = chArr[j];
                // 숫자인 경우 넘어감
                if(Character.isDigit(ch)) {
                    continue;
                }
                // 첫 글자가 소문자이면 대문자로 치환
                if(j == 0 && Character.isLowerCase(ch)) {
                    chArr[j] = Character.toUpperCase(ch);
                }
                // 첫글자가 아닌데 대문자이면 소문자로 치환
                else if(j != 0 && Character.isUpperCase(ch)) {
                    chArr[j] = Character.toLowerCase(ch);
                }
            }
            answer.append(chArr).append(" ");
        }
        return answer.toString();
    }

 

 

개선한 코드 (성공)

주어진 공백 문자를 변형하지 않기 위해서 바로 char 배열로 변환한다.

첫 문자 여부를 구분하기 위해서 인스턴스 변수를 사용하여 공백 문자인 경우 그 다음 문자는 첫 문자라고 가정한다.

여러번 공백 문자가 나오더라도 첫 문자 여부만 지정하기 때문에 문제없다.

 

그 다음엔  changeCase() 메소드를 사용해 조건에 맞게 문자를 치환한다. 치환한 문자를 char 배열의 값에 넣는다.

첫 문자 여부를 false 로 변경하여 다시 공백 문자가 나올 때까지는 첫 문자가 아님을 알 수 있도록 한다. 

 

Class Solution {
	
    boolean isFirstChar = true;
	
    public String solution(String s) {

        char[] charArr = s.toCharArray();
        for(int i = 0; i < charArr.length; i++) {
            // 공백 문자인 경우 flag true 로 변경
            if(String.valueOf(charArr[i]).isBlank()) {
                isFirstChar = true;
                continue;
            }
            char newCh = changeCase(charArr[i]);
            charArr[i] = newCh;
            isFirstChar = false;
        }
        
        return String.valueOf(charArr);
    }

    /**
     * 조건에 맞게 치환한다.
     */
    private static char changeCase(char ch) {
        char result = ch;

        // 첫 문자인데 소문자이면 대문자로 치환
        if(isFirstChar && Character.isLowerCase(ch)) {
            result = Character.toUpperCase(ch);
        }
        // 첫 문자가 아닌데 대문자이면 소문자로 치환
        else if(!isFirstChar && Character.isUpperCase(ch)) {
            result = Character.toLowerCase(ch);
        }
        return result;
    }

}

 

 

 

'solve' 카테고리의 다른 글

[프로그래머스] Lv2.숫자의 표현  (0) 2024.11.04
[프로그래머스] Lv2.이진 변환 반복하기  (0) 2024.11.01
[프로그래머스] Lv2. 최솟값 만들기 (그리디)  (0) 2024.10.29
[프로그래머스] Lv2. 올바른 괄호 (스택/큐)  (1) 2024.10.28
[프로그래머스] Lv2. 최댓값과 최솟값  (0) 2024.10.25
    'solve' 카테고리의 다른 글
    • [프로그래머스] Lv2.숫자의 표현
    • [프로그래머스] Lv2.이진 변환 반복하기
    • [프로그래머스] Lv2. 최솟값 만들기 (그리디)
    • [프로그래머스] Lv2. 올바른 괄호 (스택/큐)
    been_dev
    been_dev

    티스토리툴바