알고리즘/[항해99] 1일 1알고리즘 스터디

99클럽 코테 스터디 2일차 TIL ✒️ ASCII 코드 변환

hooooolly 2025. 4. 2. 00:13

2일차

 

✅ 오늘의 학습 키워드

  • 문자 → 아스키코드 변환
  • 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를 마친다.

 

https://hudi.blog/what-is-unicode/#%EC%84%B8%EC%83%81-%EB%AA%A8%EB%93%A0-%EB%AC%B8%EC%9E%90%EB%A5%BC-%EC%A7%80%EC%9B%90%ED%95%98%EA%B8%B0%EC%9C%84%ED%95%B4-%EB%93%B1%EC%9E%A5%ED%95%9C-Unicode

 

유니코드는 어떻게 구성되어 있을까?

유니코드 (Unicode) ASCII의 등장과 ASCII 확장이 빚은 혼란 초창기 컴퓨터에서는 아스키(ASCII)라는 문자 인코딩 방식을 사용했다. 문자 인코딩이란 문자나 기호등을 컴퓨터가 이용할 수 있는 어떠한

hudi.blog