알고리즘_21번-2021.11.10

Jonguk Kim·2021년 11월 10일
0

알고리즘

목록 보기
2/15

1. 문제: 이상한 문자 만들기

  • 문제 설명

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

  • 제한사항

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

  • 입출력 예

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


2. 설계 및 구현

  • 분류
    • 입력값: 문자열 s
    • 처리: 문자열 s를 공백을 기준으로 나눈 후, 인덱스 짝수/홀수 비교하여 대/소문자 변경
    • 출력값: 문자열
  • 생각
    • 받은 문자열을 공백을 기준으로 나눔 => split() 사용
    • 나눠진 문자열 각각의 길이 만큼 반복문 => 2차원 배열 사용 {{t, r, y}, {h, e, l, l, o}} 각각의 문자열을 문자 배열로 변경 => toCharArray() 사용
    • 반복문을 문자열(문자배열) 길이만큼 확인하면서, 조건문으로 인덱스 짝수/홀수 인지 여부 체크
    • 짝수이면 대문자로, 홀수이면 소문자로 변경 => toLowerCase(), toUpperCase() 사용
    • Character.toUpperCase(), Character.toLowerCase(), String.valueOf() 사용
  • 실패코드
import java.util.*;

class Solution {
    public String solution(String s) {
        String result = "";
        
        String[] str = s.split(" ");    // 1. 받은 문자열을 공백으로 나눔 (try, hello)
        
        for (int i = 0; i < str.length; i++){
            char[] strChar = str[i].toCharArray();   // 2. 공백으로 나눠진 각각의 문자열을 문자 배열로 만듦 (t, r, y)    
            for (int j = 0; j < strChar.length; j++){
                if (j % 2 == 0) // 3. 인덱스 짝수면 대문자, 홀수면 소문자
                    result += String.valueOf(Character.toUpperCase(strChar[j]));
                else
                    result += String.valueOf(Character.toLowerCase(strChar[j]));
            }
            if (i != str.length -1) // 마지막 제외 
                result += " ";  // 4. 한 단어 끝나면 공백 표시
        }

        return result;
    }
}
  • 성공코드
import java.util.*;

class Solution {
    public String solution(String s) {
        String result = "";
        
        String[] str = s.split("");    // 1. 받은 문자열을 한개의 단어 문자열로 나눔 ('t', 'r', 'y',' ', 'h')
        int count = 0;
        
        for (int i = 0; i < str.length; i++){
            // 2. 공백이면 다시 인덱스 확인
            if (str[i].equals(" ")){    
                count = 0;  
            }else{
                // 3. 짝수이면 대문자, 홀수이면 소문자
                if (count % 2 == 0){
                    str[i] = str[i].toUpperCase();
                    count++;
                }else{
                    str[i] = str[i].toLowerCase();
                    count++;
                }
            }
            result += str[i];
        }
        return result;
    }
}
  • 참조코드
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;
  }
}

3. 배운 것 / 느낀점

  • 실패코드: 문자열.split(" ", -1): 제일 뒤 공백 제거
    • split(String regex, int limit): 해당 문자열 기준으로 나누고, limit은 문자열을 나눌 최대 개수
    • 문자열.toCharArray(): 문자열을 문자형 배열로 만듦
    • 배열.length: 배열의 길이
    • String.valueOf(문자): 문자를 문자열로 변환
    • Character.toUpperCase(문자): 문자를 대문자로 변환
    • Character.toLowerCase(문자): 문자를 소문자로 변환
  • 성공코드: 처음에 바로 공백을 기준으로 문자열을 나누는게 아닌, 모든 문자열을 각 단어의 문자열로 나누는게 핵심
    • 문자열.split(""): 문자열에서 각각의 문자를 문자열 배열로 변경
    • 문자열.equals(" "): 문자열이 공백 문자열과 같은지 확인 (조건문에서 사용)
    • 문자열.toUpperCase(): 문자열 대문자로 변경
    • 문자열.toLowerCase(): 문자열 소문자로 변경
  • 참조코드: 모든 문자열을 각 단어의 문자열로 나눈 뒤, 삼항연산자 이용하여 짧게 작성
    • for(자료형 변수명 : 배열): 배열에 있는 모든 값을 돌아가면서 변수명에 넣어줌 (반복문)
    • 문자열.contains(" "): 문자열에 공백이 포함되었는지 확인
profile
개발일지

0개의 댓글