[Java] 이상한 문자 만들기 (programmers)

Haeun Noh·2022년 9월 2일
0

programmers

목록 보기
9/64
post-thumbnail

0903


문제 설명

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


제한 사항

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

입출력 예

sreturn
"try hello world""TrY HeLlO WoRlD"

입출력 예 설명

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


소스 코드

class Solution {
    public String solution(String s) {
        String answer = "";
        //원본 문자열의 길이
        int sLength = s.length();
        //변환된 문자들을 저장할 배열
        char[] result = new char[sLength];
        //문자열 처음부터 끝까지 하나씩 문자를 읽어보자
        int totalIndex = 0;
        int wordIndex = 0;
        while(totalIndex < sLength){
            //현재 단어의 현재 위치에서의 문자
            char c = s.charAt(totalIndex);
            //공백 문자이면 넘어가기
            if(c == ' '){
                //char배열에 문자를 저장
                result[totalIndex] = c;                
                //공백이니까 단어 인덱스는 초기화
                wordIndex = 0;
                //전체 인덱스는 증가
                totalIndex++;
                continue;
            }

            if(wordIndex % 2 == 0){
               //소문자이면 대문자로 변환
               if(c >= 'a') {
                  c = (char)(c - ('a' - 'A'));
               }
            }else {
               //대문자이면 소문자로 변환
               if(c < 'a' && c >= 'A') {
                  c = (char)(c + ('a' - 'A'));
               }
            }
            //char배열에 문자를 저장
            result[totalIndex] = c;
            //단어 인덱스는 증가
            wordIndex++;
            //전체 인덱스는 증가
            totalIndex++;
        }
        //완성된 char배열을 String으로 변환해서 리턴
        return new String(result);
    }
}

소스 풀이

	String answer = "";
    //원본 문자열의 길이
    int sLength = s.length();
    //변환된 문자들을 저장할 배열
    char[] result = new char[sLength];
    //문자열 처음부터 끝까지 하나씩 문자를 읽어보자
    int totalIndex = 0;
    int wordIndex = 0;

answer을 초기화시킨다.
원본 문자열의 길이를 나타내는 sLength 변수에 s.length()를 저장한다. 여기서 .length()인 이유는 배열이 아니기 때문에 메서드를 사용한 것이다.
변환된 문자들을 저장할 result를 선언한다. 인덱스의 크기는 원본 문자열의 길이만큼인 sLength만큼 준다.
전체 인덱스를 나타내는 totalIndex변수를 0으로 초기화한다. result에 문자 하나가 들어간다면 totalIndex++를 수행한다.
단어 인덱스를 나타내는 wordIndex변수를 0으로 초기화한다. result에 문자 하나가 들어간다면 wordIndex++를 수행하지만 result에 공백 문자가 들어간다면 wordIndex0으로 다시 초기화시킨다.


	while(totalIndex < sLength){
    	//현재 단어의 현재 위치에서의 문자
    	char c = s.charAt(totalIndex);

전체 인덱스를 나타내는 totalIndex부터 원본 문자열의 길이를 나타내는 sLength 이전까지 while문을 반복한다.

charc에 인덱스 0부터 원본 문자열의 인덱스 길이 이전까지의 s의 문자를 하나씩 읽어 저장한다.


		//공백 문자이면 넘어가기
    	if(c == ' '){
        	//char배열에 문자를 저장
        	result[totalIndex] = c;                
        	//공백이니까 단어 인덱스는 초기화
        	wordIndex = 0;
        	//전체 인덱스는 증가
        	totalIndex++;
        	continue;
        }

c공백문자이면 공백문자 그대로를 저장하는 if문이다.

변환된 문자열을 저장할 result배열에 c를 저장한다.
공백을 저장했기 때문에 단어 인덱스를 나타내는 wordIndex0으로 초기화시킨다.
반대로 전체 인덱스를 나타내는 totalIndex는 초기화시키지 않고 ++시킨다.
모든 연산을 마친 후 while문의 끝부분으로 이동하여 다시 while문을 반복시키는 continue를 수행한다.


		if(wordIndex % 2 == 0){
        	//소문자이면 대문자로 변환
            if(c >= 'a') {
                  c = (char)(c - ('a' - 'A'));
            }
            else {
               //대문자이면 소문자로 변환
               if(c < 'a' && c >= 'A') {
                  c = (char)(c + ('a' - 'A'));
               }
            }

소문자는 대문자로, 대문자는 소문자로 변환하는 if문이다.

c에 저장된 문자가 'a'보다 큰, 즉 소문자라면 c에는 'a''A'로 변할 수 있는 수인 32c에서 뺀 후, char로 캐스팅해서 c에 저장한다.

c에 저장된 문자가 'a'보다 작고 'A'보다 큰, 즉 대문자라면 c에는 'A''a'로 변할 수 있는 수인 32c에서 더한 후, char로 캐스팅해서 c에 저장한다.


		//char배열에 문자를 저장
        result[totalIndex] = c;
        //단어 인덱스는 증가
        wordIndex++;
        //전체 인덱스는 증가
        totalIndex++;
    }

c의 값이 문자일 경우 수행하는 연산이다.

변환된 문자열을 저장할 result 배열에 소문자에서 대문자로, 대문자에서 소문자로 변환된 c의 값을 저장한다.
단어 인덱스를 나타내는 wordIndex는 공백이 아직 없기 때문에 증가시킨다.
전체 인덱스를 나타내는 totalIndex를 증가시킨다.

totalIndex가 원본 문자열의 길이를 나타내는 sLength과 같아진다면 while문을 빠져나온다.


	//완성된 char배열을 String으로 변환해서 리턴
    return new String(result);

완성된 char배열을 String으로 변환하는 new String()를 사용하여 변환된 문자를 저장한 result를 변환한 후 리턴한다.



profile
기록의 힘을 믿는 개발자, 노하은입니다!

0개의 댓글