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

Benjamin·2023년 3월 17일
0

프로그래머스

목록 보기
46/58

처음에 몇몇 테케에서 틀렸는데 원인을 알 수 없었다.
알고보니, 공백이 하나 이상일 수 있는데, 결과문자열에서 이 공백개수를 그대로 재현해야하는부분을 놓쳤었다.
나는 결과 문자열에 공백이 하나만 끼도록 했었던것이다.

내 풀이

import java.util.Arrays;
class Solution {
    public String solution(String s) {
        String answer = "";
        String[] temp = s.split(" ");
        for(int j=0; j<temp.length; j++) {
            for(int i=0; i<temp[j].length(); i++) {
                if(i%2==0) answer += Character.toUpperCase(temp[j].charAt(i));
                else answer += Character.toLowerCase(temp[j].charAt(i));
            }
            temp[j] = answer;
            answer ="";
        }
        int start = 0;
        int count =0;
        for(int i=0; i<temp.length; i++) {
            int len = temp[i].length();
            start += len+count;
            count =0;
            for(int j=start; j<s.length(); j++) {
                if(!Character.isLetter(s.charAt(j))) count++;
                if(Character.isLetter(s.charAt(j))) break;
            }
            answer += temp[i];
            for(int k=0; k<count; k++) answer += " ";
        }
        return answer;
    }
}

공백 개수를 동일하게 가져가기위한 코드가 지저분하다는 생각이 든다.

다른 풀이

class Solution {
  public String solution(String s) {

        String answer = "";
        int cnt = 0;
        String[] array = s.split("");

        for(String ss : array) {
            cnt = ss.contains(" ") ? 0 : cnt + 1;
            answer += cnt%2 == 0 ? ss.toLowerCase() : ss.toUpperCase(); 
        }
      return answer;
  }
}

이렇게 간단히 구현할 수 있구나.
split을 사용하는건 동일하다.
하지만 이 풀이에서는 split(" ") 이 아닌, split("")으로 했다.
또한 for문안에서 삼항연산자를 사용해서 모든걸 해결했다.

split("")이걸 사용하면, 공백도 문자도 각각 하나씩 분리되서 들어간다!

삼항연산자를 사용해 공백이 없으면 카운트를 계속 +1해주고, 공백을 만나면 0으로 초기화한다.
카운트의 홀짝에따라 대소문자를 바꿔주는것도 삼항연산자를 사용한다.

다른 풀이2

class Solution {
    public String solution(String s) {
        String answer;
        answer = s.toUpperCase();
        char[] chars = answer.toCharArray();

        //앞문자가 대문자라면 소문자로 치환
        for (int i = 1; i < chars.length; i++) {
            if (62 <= chars[i - 1] && chars[i - 1] <= 90) {
                chars[i] = Character.toLowerCase(chars[i]);
            }
        }
        answer = String.valueOf(chars);
        return answer;
    }
}

대문자로 다 바꿔두고, 앞문자가 대문자인지 체크해서 그 다음에는 소문자가 오게 할 수도 있다.

0개의 댓글