프로그래머스 코딩 기초 트레이닝 "문자 개수 세기" 문제를 Java로 풀어봤습니다. 문자열에 등장하는 알파벳 A~Z, a~z 각각의 개수를 길이 52짜리 배열로 반환하는 문제로, char와 아스키코드를 이용한 인덱스 계산법을 정리했습니다.
포스트 본문
문제 설명
알파벳 대소문자로만 이루어진 문자열 my_string이 주어질 때, my_string에서 'A'의 개수, 'B'의 개수, ..., 'Z'의 개수, 그리고 'a'의 개수, 'b'의 개수, ..., 'z'의 개수를 순서대로 담은 길이 52의 정수 배열을 반환하는 문제입니다.
제한사항
- 1 ≤ my_string의 길이 ≤ 1,000
입출력 예
my_string result
| "Programmers" | [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0] |
"Programmers"에서 대문자 'P'가 1개, 소문자 'a'가 1개, 'e'가 1개, 'g'가 1개, 'm'이 2개, 'o'가 1개, 'r'가 3개, 's'가 1개 등장하므로 위와 같은 배열이 반환됩니다.
풀이 아이디어
핵심은 배열의 인덱스와 알파벳을 어떻게 대응시킬 것인가입니다. 문제에서 요구하는 순서는 다음과 같습니다.
- 인덱스 0~25: 대문자 A~Z의 개수
- 인덱스 26~51: 소문자 a~z의 개수
자바에서 char는 내부적으로 아스키코드 값을 갖는 정수처럼 다룰 수 있습니다. 예를 들어 'B' - 'A'는 1이 되고, 'z' - 'a'는 25가 됩니다. 이 성질을 이용하면 각 문자를 알맞은 인덱스로 바로 변환할 수 있습니다.
절차는 다음과 같습니다.
- 길이 52인 결과 배열 answer를 0으로 초기화합니다.
- 문자열을 한 글자씩 순회합니다.
- 대문자면 문자 - 'A'를, 소문자면 문자 - 'a' + 26을 인덱스로 삼아 해당 위치의 값을 1 증가시킵니다.
- 순회가 끝나면 answer를 반환합니다.
코드
class Solution {
public int[] solution(String my_string) {
int[] answer = new int[52];
for (int i = 0; i < my_string.length(); i++) {
char c = my_string.charAt(i);
if (c >= 'A' && c <= 'Z') {
answer[c - 'A']++;
} else if (c >= 'a' && c <= 'z') {
answer[c - 'a' + 26]++;
}
}
return answer;
}
}
코드 동작 설명
- answer[c - 'A']: c가 대문자일 때, 'A'와의 아스키코드 차이만큼 떨어진 위치가 바로 그 문자의 인덱스가 됩니다. 예를 들어 c가 'P'라면 'P' - 'A' = 15이므로 answer[15]가 증가합니다.
- answer[c - 'a' + 26]: 소문자는 26칸 뒤쪽(인덱스 26~51)에 저장해야 하므로, 소문자 구간에서의 상대 위치(c - 'a')에 26을 더해줍니다. 예를 들어 c가 'a'라면 0 + 26 = 26, 'z'라면 25 + 26 = 51이 되어 정확히 배열의 마지막 칸까지 채워집니다.
- 대소문자 여부는 c >= 'A' && c <= 'Z' / c >= 'a' && c <= 'z' 조건으로 판별합니다. 문제 조건상 알파벳만 들어오므로 이 두 조건 외의 경우는 신경 쓰지 않아도 됩니다.
"Programmers"로 검증해보면 'P'는 대문자이므로 answer[15]가 1 증가하고, 나머지 소문자 r, o, g, r, a, m, m, e, r, s는 각각 answer['r'-'a'+26], answer['o'-'a'+26] 등으로 누적되어 r은 3번(인덱스 43), m은 2번(인덱스 38) 증가하는 식입니다. 문제에서 제시한 결과 배열과 정확히 일치합니다.
마무리
이 문제는 알고리즘 자체보다 char와 아스키코드의 관계를 얼마나 잘 활용하는지가 핵심입니다.
'프로그래머스 > 레벨0' 카테고리의 다른 글
| [프로그래머스 코딩테스트 입문] 등수 매기기 - Java 풀이 (0) | 2026.08.30 |
|---|