CODING TEST/programmers

Day1 - 대소문자 바꿔서 출력하기

iamyuunzo 2025. 7. 8. 10:42

📌 문제 정보

- 문제 이름 : 코딩 기초 테스트 - 대소문자 바꿔서 출력하기

- 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/181949

 

 

📌 문제 요약

핵심 조건: 각 알파벳을 대문자 -> 소문자, 소문자 -> 대문자로 변환해서 출력하는 코드 작성

- 제한: 1  str 의 길이 ≤ 20 (str = 알파벳으로 이루어진 문자열) (ex. aBcDeFg -> AbCdEfG)

 

 

📌 내 풀이 및 코드

import java.util.Scanner;

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

        for(int i=0; i<a.length(); i++) {
            char c = a.charAt(i);

            if (Character.isUpperCase(c)) {
                result += Character.toLowerCase(c);
            } else {
                result += Character.toUpperCase(c);
            }
        }
        System.out.print(result);
    }
}

- 틀렸었음. 기사 풀 때 대소문자 변환하는거 눈으로 봤을 땐 풀 줄 알았는데 막상 코드로 치려니까 문법이 기억나지 않았음.

 

📌 다른 사람들 풀이

//0
StringBuilder result = new StringBuilder();

for (int i = 0; i < a.length(); i++) {
    char c = a.charAt(i);

    if (Character.isUpperCase(c)) {
       result.append(Character.toLowerCase(c));
    } else {
       result.append(Character.toUpperCase(c));
       }
    }

    // StringBuilder는 toString()으로 출력
    System.out.print(result.toString());

    sc.close();
}

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

//2
for(int i=0; i<a.length(); i++) {
    char c = a.charAt(i);
    if(Character.isUpperCase(c)) {
       System.out.print((char)(c+32));
    }
    else {
         System.out.print((char)(c-32));
    }
}

<-- 다른 풀이 요약 -->

- 0 : 실무에서 가장 많이 씀. (+=보다 빠름. 표준 메서드 사용으로 가독성에 좋음.)

- 1 : for-each문으로 char 하나씩 꺼내는 방식.

- 2 : 아스키 테이블 구조 활용 (가장 빠르지만 유니코드에서 깨질 수 있음.)

  내 코드 StringBuilder (0) toCharArray + += (1) ASCII (아스키 연산) (2)
핵심 연산 String += StringBuilder.append() String += System.out.print 직접
출력 마지막에 System.out.print(result) System.out.print(result.toString()) System.out.println(answer) System.out.print 반복
속도 느림 (큰 입력에서 느림) 빠름 느림 (같은 원리) 매우 빠름
메모리 효율 새 문자열 계속 만듦 버퍼로 효율적 새 문자열 계속 만듦 버퍼 없이 즉시 출력
가독성 직관적 표준적, 실무 스타일 직관적 로우레벨, 직관적
안전성 표준 메서드 표준 메서드 표준 메서드 아스키 직접 연산 (한글/기타 문자 깨질 위험)
코드 길이 짧음 조금 길어짐 짧음 가장 짧음
실무 적합 ❌ 큰 데이터엔 비효율 ✅ 실무에서도 정석 ❌ 큰 데이터엔 비효율 ❌ 실무에선 안 씀
코테 적합 ✅ (문자열 짧으면 무조건 OK) ✅ (알파벳만 쓴다면!)



📌 새로 배운 문법

<-- 이번 문제에서 새로 배운 Java 문법 정리 -->

** charAt() **

- 문자열에서 문자 하나를 가져올 때 쓴다. (문자 인덱스는 0부터 시작)

- String으로 저장된 문자열 중에서 한 글자만 선택해서 char타입으로 변환해줌.

 

** 대문자(Upper)와 소문자(Lower) **

1. 대문자, 소문자 판별 (is)

- Character.isUpperCase() : 문자가 대문자인지 판별할 때 씀.

- Character.isLowerCase() : 문자가 소문자인지 판별할 때 씀.

2. 대문자, 소문자 변환 (to)

- Character.toUpperCase() : 문자를 대문자로 바꿀 때 사용.

- Character.toLowerCase() : 문자를 소문자로 바꿀 때 사용.

 

** for-each문 **

- 배열, 리스트 같은 여러 개 묶음 데이터를 처음부터 끝까지 하나씩 자동으로 꺼내서 돌릴 때 사용하는 반복문

- char c : 문자 하나씩 자동으로 꺼냄. / toCharArrary() : 문자열 -> 문자 배열로 바꿈

String str = "ABC";
for (char c : str.toCharArray()) {
    System.out.println(c);
}

// Result
// A
// B
// C

 

** 아스키 연산 **

- 컴퓨터는 문자를 숫자(코드값)으로 저장하는데 이것을 아스키 코드라고 함.

- 아스키 연산은 "문자 ↔ 숫자" 를 직접 계산해서 대소문자 바꾸는 트릭임.

- ex. 'A'=65, 'a'=97 (대문자 A와 소문자 a는 32 차이가 남.)

- 대문자 -> 소문자 : 코드값에 +32 / 소문자 -> 대문자 : -32

(대문자 ↔ 소문자 변환은 아스키 코드에서 항상 32 차이라는 것을 기억하기)

// 1 : upper이라는 문자 변수에 대문자 A를 넣으면 컴퓨터가 내부적으로 A를 숫자 65로 저장함.
//   : upper A = 65였으니까 (char)(65+32) = (char)(97) = a (char이 다시 문자로 바꾸는 역할)
char upper = 'A'; // 65
char lower = (char)(upper + 32); // 'a'

// 2 : lower2라는 문자 변수에 소문자 b를 넣으면 컴퓨터가 내부적으로 b를 숫자 98로 저장함.
//   : lower2 b = 98였으니까 (char)(98-32) = (char)(66) = B
char lower2 = 'b'; // 98
char upper2 = (char)(lower2 - 32); // 'B'

- 쓰는 이유? : Character.toUpperCase와 같은 함수 안 쓰고 숫자 계산으로 빠르게 바꿀 수 있음.
(But, 영어 알파벳 외에 한글, 기호, 특수문자 등은 안되기 때문에 깨진다는 단점이 있음.)