알고리즘/프로그래머스

이상한 문자 만들기(JAVA)

mrban 2022. 1. 18. 21:27

1. 문제

매개변수로 받은 문자열 s는 한 개 이상의 단어로 구성된다. 각 단어는 하나 이상의 공백문자로 구분된다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수를 만드시오.

 

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

 

3. 정답
class Solution {
    public String solution(String s) {
        char[] temp = s.toCharArray();
        int j = 0;
        String answer = "";

        for (int i = 0; i < temp.length; i++) {
            if (temp[i] == ' ') {
                j = 0;
                continue;
            }
            else if (j % 2 == 0 && 'a' <= temp[i] && temp[i] <= 'z') {
                temp[i] -= 32;
            }
            else if (j % 2 != 0 && 'A' <= temp[i] && temp[i] <= 'Z') {
                temp[i] += 32;
            }
            j++;
        }
        answer = String.valueOf(temp);
        return answer;
    }
}
 

4. 설명

4-1. String s에 대하여 한글자한글자 접근하기 위해서 toCharArray()함수를 활용해 배열 temp로 바꿔주었다.

4-2. for문에서 i는 배열 전체에서의 위치를 의미한다. 반면에 j는 공백을 기준으로 구분되는 각 단어의 위치를 의미한다.

4-3. 예를 들어 temp = {'사', '과', ' ', '바', '나', '나'}라고 했을 때 '바'의 위치는 i = 3이지만 j = 0 인 것이다.

4-4. for문을 배열의 길이만큼 돌면서 공백을 만난다면 단어가 새로 시작한다는 의미이므로 j = 0으로 초기화되고 i는 1 증가시켜주고 넘어간다.

4-5. 공백이 아니고 단어에서 해당 문자가 짝수번째면 소문자는 대문자로 만들어주고 홀수번째면 대문자를 소문자로 만들어준다.

4-6. String.valueof 함수를 통해 변환해준 temp 배열을 String으로 바꿔주고 return한다.

 

5. 참고

5-1. 우리가 입력하는 문자를 컴퓨터는 이해하지 못하기 때문에 사실 우리가 문자를 입력해도 컴퓨터는 이를 숫자로 바꿔 인식을 하게 된다. 예를 들어 'a' 를 97로 인식한다. 따라서 문자를 바꿔야할때 이런 원리를 이용하여 숫자 계산만으로 간단히 문자를 바꿀 수 있는 것이다. 위 코드에서는 소문자에서 대문자로 혹은 대문자에서 소문자로 바꾸기 위해서 32값을 빼거나 더해주는 것이다.

5-2. C언어에서는 컴퓨터가 이해하는 문자들의 숫자집합에 대해 아스키코드라는 규칙이 존재했다. 자바는 유니코드라는 규칙을 적용한다. 유니코드에도 여러가지 종류가 있는데 그 중에서도 가장 유명한 UTF-8을 사용한다. 유니코드는 아스키코드가 각 나라들의 언어들을 지원하지 못하는 한계에서 벗어나기 위해 등장한 규칙이다. 여러가지 언어들을 지원하고 있기 때문에 유니코드를 아스키코드의 확장판으로 이해하면 쉽다. 영문자나 숫자, 특별기호에 대한 아스키코드 규칙이 유니코드에서도 똑같이 적용이 되기 때문에 같은 숫자로 적용시켜도 문제될 것이 없다.