✅ 오늘의 학습 키워드
- 문자 → 아스키코드 변환
- Character 메서드
- 문자 직접 비교
🔍 오늘의 문제 분석
- 100개 이하의 문장이 주어진다
- 각 문장의 길이는 100을 넘지 않는다
- 각 문장은 알파벳 소문자, 대문자, 숫자, 공백으로만 이루어져 있다
- 각 종류대로 구분해서 개수를 출력한다
이 문제를 보고 가장 먼저 떠오른 것은 아스키코드를 사용해서 구분하는 것이였다. String을 int형으로 강제 변환해서 9이하이면 숫자, 65이상 90이하이면 대문자로 조건식을 작성했다.
✨ 오늘의 회고
처음 생각했던 방향대로 조건식을 작성하다 보니 공백과 숫자를 구분하는것이 어려웠다. 아스키코드에서 공백은 32이고 숫자는 48 ~ 57인데 이런 것을 몰랐다. 숫자인 char이더라도 int형으로 변환하면 아스키코드 값으로 반환되어 직접적인 숫자로 비교할 수 없다는 것을 알게되었다.
자바에서 char은 유니코드 값을 저장하는 16비트 부호 없는 정수 (0~65535) 이다. 이를 int로 변환하면 유니코드 값이 반환된다.
char ch = '0';
int ascii = (int) ch;
System.out.println(ascii); // 출력: 48
그래서 올바른 비교 방식은 문자 '0' ~ '9'의 아스키 코드 범위로 조건식을 만들거나 int로 변환하지 않고 직접 문자를 비교한다.
if ((int) ch >= 48 && (int) ch <= 57) { // '0'~'9'의 아스키 코드 범위
num++;
}
if (ch >= '0' && ch <= '9') { // 직접 문자 비교
num++;
}
이렇게 작성한 최종 코드 🔽
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Day2_10820 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = br.readLine()) != null) {
int lower = 0, upper = 0, num = 0, space = 0;
for (char ch : line.toCharArray()) {
int ascii = (int) ch; // 아스키 값으로 변환
if (ascii >= 97 && ascii <= 122) { // 소문자
lower++;
} else if (ascii >= 65 && ascii <= 90) { // 대문자
upper++;
} else if (ascii >= 48 && ascii <= 57) { // 숫자
num++;
} else if (ascii == 32) { // 공백
space++;
}
}
System.out.printf("%d %d %d %d%n", lower, upper, num, space);
}
}
}
아래는 Character 클래스의 메서드를 이용해서 다른 방식으로 풀이해보았다. 🔽
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = br.readLine()) != null) {
int lower = 0, upper = 0, num = 0, space = 0;
for (char ch : line.toCharArray()) {
if (Character.isLowerCase(ch)) {
lower++;
} else if (Character.isUpperCase(ch)) {
upper++;
} else if (Character.isDigit(ch)) {
num++;
} else if (ch == ' ') {
space++;
}
}
System.out.printf("%d %d %d %d%n", lower, upper, num, space);
}
}
}
이렇게 방법을 바꿔보았더니 실행 시간과 메모리가 단축되었다. 😮
여기서 한번 더 개선하자면, 두번째 코드도 toCharArray() 대신 charAt()을 사용해서 추가적인 메모리가 사용되는 것을 줄이고 Character 메서드 대신 문자를 직접 비교해서 성능을 향상시킬 수 있었다.
마지막으로 유니코드에 대해서 알아보고 TIL를 마친다.
유니코드는 어떻게 구성되어 있을까?
유니코드 (Unicode) ASCII의 등장과 ASCII 확장이 빚은 혼란 초창기 컴퓨터에서는 아스키(ASCII)라는 문자 인코딩 방식을 사용했다. 문자 인코딩이란 문자나 기호등을 컴퓨터가 이용할 수 있는 어떠한
hudi.blog
'알고리즘 > [항해99] 1일 1알고리즘 스터디' 카테고리의 다른 글
99클럽 코테 스터디 6일차 TIL ✒️계단 오르기 (0) | 2025.04.07 |
---|---|
99클럽 코테 스터디 5일차 TIL ✒️Stack을 Queue로 구현하기+제네릭 (0) | 2025.04.04 |
99클럽 코테 스터디 4일차 TIL ✒️Stack을 이용해서 Queue 구현 (0) | 2025.04.03 |
99클럽 코테 스터디 3일차 TIL ✒️!!초콜릿 중독 주의!! (0) | 2025.04.03 |
99클럽 코테 스터디 1일차 TIL ✒️char[] 문자열 비교하기 (0) | 2025.04.01 |