Language/JAVA

[프로그래머스] 이상한 문자 만들기

paran21 2022. 1. 17. 22:22

 

처음에 짰던 코드는 다음과 같다.

단어를 나눈다음에 띄어쓰기 기준으로 다시 합치기 위해

1) 단어를 배열로 나누고 2) 단어를 char[]로 나누어서 대문자로 변경을 하였다.

그런데 문제에서 "하나 이상의 공백문자"가 있어 해당 코드로는 테스트를 통과할 수 없다.

import java.util.regex.Pattern;

class Solution {
    public String solution(String s) {
        String answer = "";
        //단어 수 구하기
        int count = 1;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == ' ') {
                count++;
            }
        }
        //띄어쓰기 기준으로 잘라 배열로 만들기
        String[] arr = new String[count];
        arr = s.split(" ");

        //짝수번째 인덱스만 대문자로 변환 : char로 변환 후 다시 string으로 변환
        for (int i = 0; i < arr.length; i++) {
            char[] word = arr[i].toCharArray();
            for (int j = 0; j < word.length; j++) {
                if (j % 2 == 0) word[j] = (char) (word[j] - 32);
            }
            String changedWord = String.valueOf(word);
            arr[i] = changedWord;
            answer = String.join(" ", arr);
        }
            return answer;
        }
    }

 

split(regex, limit)

  • split에서 띄어쓰기는 "\\s"로도 쓸 수 있고, 여러 공백을 한번에 처리하기 위해 "\\s+"로 쓸 수 있다.
  • split limit 값을 양수로 주면 지정된 크기만큼 나누어지고, 음수를 주면 모든 구분값을 나눠서 배열로 반환한다.

위의 문제에서 split("\\s+")를 사용하여도 공백 크기를 알 수 없어 다시 String으로 전환할 수 없기 때문에, 처음부터 모든 단어를 분할해서 글자마다 처리해주는 것이 낫다.

 

class Solution {
    public String solution(String s) {
        String answer = "";
        //공백 포함 모든 글자를 나누어 배열로 전환
        String[] arr = s.split("");
        int index = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i].equals(" ")) {
                index = 0;
            } else {
                arr[i] = (index % 2 == 0) ? arr[i].toUpperCase() : arr[i].toLowerCase();
                index++;
            }
        }
        //배열을 문자열로 변환
        answer = String.join("", arr);
        return answer;
    }
}

각 단어별로 인덱스를 계산하기 위해 index라는 값을 별도로 설정했고, 공백인 경우 0으로 초기화되게 하였다.

처음에 index를 for문 안에서 선언을 하여 모든 값이 대문자로 출력이 되었다.

for문 안에 있으면 for문을 돌때마다 index가 다시 0으로 초기화되기 때문에 for문 전에 미리 선언을 해줘야 한다.

if문이 또 사용되면 코드가 너무 길어질 것 같아서 삼항연산자를 함께 사용하였다.