Post

백준 10806번

백준 10806번

[Bronze IV] 알파벳 개수 - 10808

문제 링크

성능 요약

메모리: 14272 KB, 시간: 104 ms

분류

구현, 문자열

제출 일자

2026년 3월 4일 12:15:34

문제 설명

알파벳 소문자로만 이루어진 단어 S가 주어진다. 각 알파벳이 단어에 몇 개가 포함되어 있는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.

출력

단어에 포함되어 있는 a의 개수, b의 개수, …, z의 개수를 공백으로 구분해서 출력한다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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 S = br.readLine();
        int[] alp = new int[26];
        
        for (int i = 0; i < S.length(); i++) {

            char c = S.charAt(i);
            int index = c - 97;

            alp[index]++;

        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 26; i++) {

            sb.append(alp[i]).append(" ");

        }

        System.out.println(sb);

    }
}

1. 초기 접근 방식

  • 초기 접근: 입력된 단어를 순회하면서 ‘a’부터 ‘z’까지의 개수를 세어야 함.
  • 로직 구상: a~z까지 26개의 if문을 작성하는 것은 사람이 치기에도, 실행하기에도 비효율적이므로 아스키코드의 성질을 활용함. ‘a’의 아스키코드 값이 97이므로, 각 문자에서 97을 뺀 값을 크기가 26인 배열의 인덱스로 사용하여 개수를 증가(++)시키는 방식을 구상함.
  • 문제 풀이 중 고민한 점: 단어의 길이를 도는 for문 1개와 배열 출력을 위해 26번 도는 for문 1개를 사용했는데, for문이 2번 쓰여서 실행 속도가 너무 느리지 않을까 우려함.

2. AI 튜터 활용

질문 : ‘배열과 아스키코드를 이용해 풀었지만, for문이 2번이라 너무 느릴 것 같다.’라고 질문.

AI의 답변 :

  1. 중첩 반복문과 시간 복잡도 두 개의 for문이 중첩(하위로 포함)된 형태가 아니라 완전히 분리되어 따로따로 실행되므로, 전체 연산 횟수는 최대 단어 길이(100) + 알파벳 개수(26) = 126번에 불과합니다. 컴퓨터는 1초에 약 1억 번의 연산을 처리하므로, 현재 방식은 실행 속도에 전혀 무리가 없는 최적화된 시간 복잡도 O(N) 방식입니다.

  2. 매직 넘버(97) 대신 문자 연산 활용 자바는 내부적으로 문자를 아스키코드 숫자로 계산합니다. 따라서 97이라는 의미를 알기 어려운 숫자 대신, int index = c - 'a'; 라고 작성하면 아스키코드를 외우지 않아도 누구나 직관적으로 코드의 의도를 이해할 수 있습니다.

얻은 깨달음 :

  • 반복문이 여러 번 쓰였다고 무조건 느린 것이 아니며, 중첩 여부를 파악해 정확한 연산 횟수와 시간 복잡도(O(N))를 계산하는 것이 중요하다.
  • 의미가 불명확한 숫자(매직 넘버) 대신, 자바의 문자 연산 특징('b' - 'a' = 1)을 활용하면 가독성 높은 코드를 작성할 수 있다.
This post is licensed under CC BY 4.0 by the author.