본문 바로가기

코딩 테스트

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

728x90

문제


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

 

< 제한 사항 >

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

 

-  출력 예시  -

정답 코드


<  내 정답 코드  >

import java.util.*;

class Solution {
    public String solution(String s) {
        String answer = "";
        String[] a = s.split(" ", -1);

        for (int i = 0; i < a.length; i++) {
            String msg = a[i];
            for (int j = 0; j < msg.length(); j++) {
                if (j % 2 == 1) {
                    String b = Character.toString(msg.charAt(j));
                    answer += b.toLowerCase();
                } else {
                    String b = Character.toString(msg.charAt(j));
                    answer += b.toUpperCase();
                }
            }
            if (i == a.length - 1) {
                break;
            }
            answer += " ";
        }

        return answer;
    }
}

 

 

<  타인 답변 코드  1  >

//  문자열을 char[] 배열로 만들어서 한 글자씩 변환하기
//   ( if 문 사용 버전 )

import java.util.*;
class Solution {
    public String solution(String s) {
        String[] strArr = s.split("");
        String answer = "";
        int idx = 0;

        for (int i = 0; i < strArr.length; i++) {
            if (strArr[i].equals(" ")) {
                idx = 0;
            } else if (idx % 2 == 0) {
                strArr[i] = strArr[i].toUpperCase();
                idx++;
            } else {
                strArr[i] = strArr[i].toLowerCase();
                idx++;
            }
            
            answer += strArr[i];
        }

        return answer;
    }
}

 

 

<  타인 답변 코드  2  >

//  문자열을 char[] 배열로 만들어서 한 글자씩 변환하기
//   ( 삼항연산자 버전 )

import java.util.*;
class Solution {
    public String solution(String s) {
        String[] strArr = s.split("");
        String answer = "";
        int idx = 0;

        for (String str : strArr) {
            idx = str.contains(" ") ? 0 : idx + 1;
            answer += idx % 2 == 0 ? str.toLowerCase() : str.toUpperCase();
        }

        return answer;
    }
}

 

<  타인 답변 코드  3  >

//  String 을 char 배열로 바꿔서 하나씩 변환하기

class Solution {
  public String solution(String s) {
        char[] chars = s.toCharArray();
        int idx = 0;

        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == ' ')
                idx = 0;
            else
                chars[i] = (idx++ % 2 == 0 ? Character.toUpperCase(chars[i]) : Character.toLowerCase(chars[i]));
        }

        return String.valueOf(chars);
  }
}

이것을 주의하자!


-  이 문제를 해결하는 방법은 크게 두 가지가 있다. 관건은 각 단어별로 시작 인데스를 어떻게 잡는가에 있다.

 

    (1)  빈칸을 기준으로 '하나의 단어'를 String [ ] 배열에 넣고, 배열 원소마다 for 문을 또 돌려서

            단어의 알파벳 인덱스를 확인하기.

            :  중복 for 문으로 돌리기 때문에 for 문의 i 인덱스로 홀수, 짝수를 구분할 수 있다.

 

    (2)  처음부터 '알파벳 하나씩' String [] 배열에 넣은 다음, 인덱스는 따로 관리하면서 대소문자 바꾸기.

            :  각각의 알파벳을 한 번에 배열에 저장하기 때문에, 별도의 인덱스 변수를 만들어서 공백일 때는

                0을, 아니면 인덱스 + 1을 하면서 홀수, 짝수를 구분한다.

 

.split("    ") 메서드는 빈칸을 기준으로 String [ ] 배열을 만든다. 따라서 빈칸이 있을 때 배열의 원소를 넣는다. 하지만 .split("")은 String 객체를 이루는 모든 원소를 하나씩 String [ ] 배열로 만든다.

 

문자열.split( "  " ) 은 문자열이 공백 문자로 끝나는 경우 이를 무시해 버린다. 마지막에 오는 빈 문자열도 포함시키려면 문자열.split( "  " ,  - 1 ) 라고 해야 한다.  

 

.toCharArray() 메서드는 String 객체의 원소를 하나씩 char [] 배열로 만든다.

 

-  String 객체가 '공백'을 포함하는지 확인하기 위해선 두 가지 메서드로 가능하다. contains( ) 메서드는 해당 값이 들어가 있는지 boolean 값으로 나타낸다. contains("  ");  이렇게 하면 해당 String 객체가 공백이 있는지 알 수 있다.equals("  ") 으로 해당 String 이 공백인지 확인할 수 있다.

 

-  String 의 메서드론 toUpperCase() 와  toLowerCase() 가 있다. 둘 다 String 객체를 대상으로 대소문자를 변경한다. 만약 char 형 이라면, Character.toUpperCase() Character.toLowerCase() 을 사용해야 한다.

 

-  공백을 대소문자 변환 메서드로 사용해도 문제가 없다. 단순히 공백은 공백으로 나올 뿐이다. 오로지 알파벳만 반응해서 변환된다.