프로그래머스_이상한 문자 만들기(JAVA)
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;
}
}