Algorithm/프로그래머스

프로그래머스_이상한 문자 만들기(JAVA)

류진주 2021. 7. 3. 15:28

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

 

코딩테스트 연습 - 이상한 문자 만들기

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을

programmers.co.kr

문제 설명

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

제한 사항

  • 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
  • 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

입출력 예

s return
"try hello world" "TrY HeLlO WoRlD"

입출력 예 설명

"try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다. 따라서 "TrY HeLlO WoRlD" 를 리턴합니다.

 

[문제 분석]

문자 사이의 공백이 여러 개 존재하는 경우와, 마지막 문자 이후에 등장하는 공백을 처리하는 방법에 대해 고려하는 것이 중요한 문제였다. 

우선 String s의 모든 문자를 대문자로 변경해주고, 홀수 인덱스에 해당하는 문자만 소문자로 변경해주기로 하였다.

그리고 빈 문자열 str을 선언하고, 반복된 공백은 하나만 받아주는 문자열을 완성하였다.

(ex) "TRY  HELLO WORLD" -> "TRY HELLO WORLD")

그리고 동시에 단어 사이의 공백의 수를 count 해주며 정수 배열인 blank에 넣어주었다.

 

위의 단계가 완료되고 나면 공백을 기준으로 단어를 나누고 나눈 단어를 string배열 split_s에 넣어주었다.

그리고 split_s에 존재하는 단어들을 대상으로 index가 홀수이면 소문자로 변경해주는 작업을 진행하였다.

이 작업은 해당 index 전까지의 string에 해당 index에 해당하는 문자를 소문자로 변경하여 더해주고, 해당 index 이후의 문자열을 받아와 이 또한 붙여주는 작업을 하여 하나의 단어를 완성했다.

(ex) HELL0 -> H+e+LL0 -> HeL+l+O =>HeLlO)

 

이렇게 완성된 단어들을 빈 문자열 answer에 더해주고 각 문자 사이의 공백을 blank 배열에서 가져와 반복문을 돌려가며 해당 count만큼 공백을 이어붙여주었다.

 

[코드]

import java.util.*;
class Solution {
    public String solution(String s) {
        String answer = "";
        s = s.toUpperCase();
        String str="";
        char ch;
        int b=-1;
        ArrayList<Integer> blank= new ArrayList<>();
       
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)==' '&&i>0&&s.charAt(i-1)==' '){
                blank.set(blank.size()-1,blank.get(blank.size()-1)+1);
                continue;
            }
            if(s.charAt(i)==' '){
                blank.add(1);
            }    
            str+=s.charAt(i);
        }
   
        String[] split_s = str.split(" ");
       
        for(int i=0;i<split_s.length;i++){
            for(int j=0;j<split_s[i].length();j++){
                ch = split_s[i].charAt(j);
                if(j%2==1){
                    ch+=32;
                    split_s[i] = split_s[i].substring(0,j)+Character.toString(ch)+split_s[i].substring(j+1);
                }
                
            }
        }
      
        for(int i=0;i<split_s.length;i++){
            answer+=split_s[i];
            if(i<blank.size())
                for(int j=0;j<blank.get(i);j++)
                    answer+=" ";
        }
   
        return answer;
    }
}