Day1 - 대소문자 바꿔서 출력하기
📌 문제 정보
- 문제 이름 : 코딩 기초 테스트 - 대소문자 바꿔서 출력하기
- 문제 링크: 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, 영어 알파벳 외에 한글, 기호, 특수문자 등은 안되기 때문에 깨진다는 단점이 있음.)