코딩테스트 - 프로그래머스/Lv. 0

[4] JAVA 대소문자 바꿔서 출력하기

유혁스쿨 2023. 11. 13. 17:16
728x90
반응형

문제설명
영어 알파벳으로 이루어진 문자열 str이 주어집니다.

각 알파벳을 대문자는 소문자로 소문자는 대문자로 변환해서 출력하는 코드를 작성해 보세요.

제한사항

  • 1 <= str의 길이 <= 20
    • str은 알파벳으로 이루어진 문자열입니다.

 

입력 #1

aBcDeFg

출력 #1

AbCdEfG


[제출 답안]

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.next();
        if(input.length() >= 1 && input.length() <= 20) {
            String[] strArray = input.split("");
            String data = "";
            for (int i = 0; i <= strArray.length-1; i++) {
                String alphabet = strArray[i];
                int ascii = strArray[i].charAt(0);
                /* 알파벳으로만 이루어진 경우 실행 */
                if ((ascii >= 65 && ascii <= 90) || (ascii >= 97 && ascii <= 122)) {
                    boolean result = isUpperLower(ascii);
                    if (result) { //true일 경우 소문자
                        data += alphabet.toUpperCase();
                    }
                    if (!result) { //false일 경우 대문자
                        data += alphabet.toLowerCase();
                    }    
                }
            }
            System.out.println(data);
        }
    }
    
    public static boolean isUpperLower(int ascii) {
        boolean result = false;
        /* 소문자 일 경우 true */
        if (ascii >= 65 && ascii <= 90) {
           result = false;
        }
        /* 대문자일 경우 false */
        if (ascii >= 97 && ascii <= 122) {
            result =  true;
        }
        return result;
    }
}

[풀이과정] 

핵심 : ascii 값, split(String value), charAt(int idx)

스캐너를 통해 입력받은 input 데이터에 대해 split() 메소드를 사용하여 String 배열로 변환한다.

변환된 String배열의 길이만큼 반복문을 사용하여 각 요소에 접근하여 String 문자열로 추출한 뒤,

해당 문자열을 charAt() 메소드를 통해 int로 변환한뒤 ascii 코드값으로 사용될 int타입 변수에 담아준다.

반복문 내에서 각 요소의 ascii값을 기준으로 if조건문을 통해 알파벳 여부를 검증하고

알파벳이 맞다면 대/소문자 여부를 boolean으로 받아온다.

true일 경우 기존 알파벳 요소를 대문자로 변경하여 누적으로 저장하고, false일 경우 소문자로 변경하여 누적으로 저장한다.

 

[리팩토링]

String에 누적으로 저장할 때 StringBuffer를 활용하면 좋을것 같다.


[다른사람 풀이]

핵심 : Character.isLower(Upper)Case(char c), toLower(Upper)Case(char c) / String.toCharArray()

Character.isUpperCase(char c)

char 타입의 Wrapper 형인 Character의 메소드인 isUpperCase 혹은 isLowerCase는

해당 문자의 대/소문자 여부를 확인하여 boolean으로 반환한다.

먼저 입력받은 String문자를 toCharArray()를 통해 배열로 반환한 뒤

향상된 for문을 통해 반환받은 Character 타입의 데이터의 대/소문자 여부를 확인한 뒤

대문자일 경우 toLowerCase()메소드를 활용하여 소문자로 변환하고 소문자일 경우 toUpperCase() 메소드를 활용하여 대문자로 변환한다.

import java.util.*;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String a = sc.next();
        String answer = "";

        for(Character c : a.toCharArray()){
            if(Character.isUpperCase(c)){
                answer += Character.toLowerCase(c);
            }
            if(Character.isLowerCase(c)){
                answer += Character.toUpperCase(c);
            }
        } 
        System.out.println(answer);
    }
}

 

 

핵심: String.valueOf(int idx)

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String a = sc.next();

        String answer = "";
        for (int i=0; i<a.length(); i++) {
            char index = a.charAt(i);

            if (index >= 65 && index <= 90) {
                answer += String.valueOf(index).toLowerCase();
            } else {
                answer += String.valueOf(index).toUpperCase();
            }
        }

        System.out.println(answer);
    }
}

내가 작성한 코드의 방식과의 가장 중요한 차이점은 valueOf(int idx)를 통해 문자열에서 매개변수로 넘긴 인덱스에 위치한 문자에 바로 접근한다.

이로 인해 불필요한 split코드를 제거할 수 있게 된다.

또한 ascii코드의 알파벳 대소문자 여부를 확인하는 isUpperLower()메소드를 따로 구현하는 대신

분기문을 바로 지정하여 대/소문자 변환을 진행한다.

코드가 효율적으로 단축된다.

728x90
반응형