본문 바로가기
Programming/Algorithm

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

by 안녕주 2023. 9. 12.

1️⃣ 문제 설명

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

 

2️⃣ 제한 사항

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

 

3️⃣ 입출력 예

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

 

4️⃣ 입출력 예 설명

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

 


☠️망한 코드

import java.util.StringTokenizer;

class Solution {
    public String solution(String s) {
        String answer = "";
        
        //' ' 이나 tab이나... 여튼 나오면 Token하나로 판단 ' ' 포함!
        StringTokenizer st = new StringTokenizer(s);
        
        //다음 토큰이 있다면 'try ', 'hello ','world' 단위로 가져오기 
        while(st.hasMoreTokens()){
            //토큰 덩어리 하나씩 가져와서 
            String a = st.nextToken();
            //배열에 t r y ' ' 이렇게 넣을 예정
            // 아니면 문자열 요소에 하나하나에 접근할 수 있는게 있나?
            char arr[] = new char[a.length()];
            
            for (int i = 0; i < a.length(); i++) {
                //대문자 적용하려면 메소드 모르니까 아스키코드로 접근하자
                
                if(i == 0 || i % 2 == 0){ //짝수면
                    arr[i] = Character.toUpperCase(a.charAt(i)); //대문자
                    //요소 하나하나 String으로 바꿔서 answer에 붙이기
                    answer.concat(Character.toString(arr[i]));
                }
		    }
            if  (st.hasMoreTokens()){
                answer.concat(" ");
            }
        }        
        return answer;
    }
}

🌱 문제풀이

 

class Solution {
    public String solution(String s) {
        StringBuffer sb = new StringBuffer(); // 문자열 이어 붙일 곳
        
        int count = 0; //짝 홀 카운트하는 변수 - 공백을 만나면 초기화해야함
        for(int i = 0; i < s.length(); i++){
            
            if(count % 2 == 0 && s.charAt(i) != ' '){
                sb.append(Character.toUpperCase(s.charAt(i))); //대문자를 넣는다
            } else{
                sb.append(Character.toLowerCase(s.charAt(i))); //소문자를 넣는다 - 혹시나 입력문자가 대문자일 상황 대비
            }
            count++;
            
            if(s.charAt(i) == ' '){
                count = 0;
            }
            
        }
        
        return sb.toString();
        
    }
}

단어별로 해당 알파벳이 짝수번째인지 홀수번째인지를 판단할 count변수를 사용

문장의 길이만큼 반복문을 돌면서 짝수이고, 공백이 아닌 문자의 경우 대문자로 변화해서 문자열에 이어붙이기

아닐경우에는 소문자를 넣는다.

 

만약 공백을 만났을 경우 count 변수 0으로 다시 초기화

 


🛎️ NEW

 

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;
  }
}

- 굳이 if문 써서 해당 문자가 공백('  ')인지 판단 안하고 String.contains(' ')를 사용해서 코드 축소가능!

- Character.toUpperCase() 말고도 String.toUpperCase()도 가능하다...! 

- String.charAt(i) 안하고 배열돌려서 문자 하나하나에 접근가능

 

문자열 문제나올 때 필요한것 
1. String, Char의 기본메소드들 정리 및 암기
2. 문자열 분리하는법 정리 - String.split(''"), StringBuffer, StringBuilder, StringTokenizer 사용법 숙지

 

 

 

댓글