Algorithm/Programmers(Java)

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

비망노트 2022. 12. 24. 18:09

문제 설명

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

 

제한사항

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

 

입출력 예

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

 

입출력 예 설명

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

 

 

 

⭕ 풀이

 

class Solution {
    public String solution(String str) {
        
        String result ="";
        str = str.toLowerCase();
        int flag = 0;
		
        for(int i=0;i<str.length();i++) {
			
            if(str.charAt(i)==32) {
                result += " ";
                flag = 0;
            }else {
                flag++;
                if(flag%2==1) {
                    result += String.valueOf(str.charAt(i)).toUpperCase();
                }else if(flag%2==0) {
                    result += str.charAt(i);
                }
            }
        }
        return result;
    }
}

 

✅ 흐름

 

1. 입력되는 문자열이 대문자고정, 소문자고정 이라는 말이 없었으므로
    섞여있다는 가정하에 toLowerCase를 사용해 전부 소문자로 만들어준다.

 

2. 입력받은 문자열 str의 각 인덱스를 charAt으로 비교한다

 

3. char 32라면 즉 공백이라면 반환할 문자열 result에 공백을 합친다.

 

3-1. 32가 아니라면 식별하기위한 변수 flag를 증가시키고
       증가된 flag를 기준으로 홀수라면 대문자로 짝수라면 그대로 result에 합친다.

 

4. 이후 반복문을 돌다 다시 32 공백을 만난다면 flag를 0으로 초기화시킨다.

 

 

 

사실 처음에 StringTokenizer로 단어만 뽑은 뒤 사이사이 공백을 넣어주도록 풀이했었던 방식으로 제출했더니

문제의 테스트케이스를 통과했는데 자꾸 채점에서 다섯문제밖에 통과가 안되었다..

이렇게 저렇게 해보다 질문하기를 참고해봤더니  공백이 여러개일 경우 해당 공백을 그대로 다 보여주어야한다는 글을 봤다.

하나이상의 공백문자로 구분되어있다. 이게 이말이었구나...

그래서 공백은 공백대로 더해주기 위해 split이나 Stringtokenizer로 쪼개지않고 

입력받은 문자열을 그대로 사용하되 문자가 연속으로 나오는지를 비교하기위해서 flag변수를 사용했다.

 

테스트케이스를 통과했는데 채점에서 틀린다면 문제를 제대로 읽어보자..

 

 

 

-출처

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

 

 

 

 

 

 

 

 

 

 

 

 

 

-출처