27. [Java] 문자 개수 세기
https://school.programmers.co.kr/learn/courses/30/lessons/181902
- 알파벳 대소문자로만 이루어진 문자열 my_string이 주어질 때,
- my_string에서 'A'의 개수, my_string에서 'B'의 개수,..., my_string에서 'Z'의 개수, my_string에서 'a'의 개수, my_string에서 'b'의 개수,..., my_string에서 'z'의 개수를 순서대로 담은 길이 52의 정수 배열을 return
- 1 ≤ my_string의 길이 ≤ 1,000
정답코드
class Solution {
public int[] solution(String my_string) {
int[] answer = new int[52];
/*
for (int i = 0; i < my_string.length(); i++) {
}
*/
for (char ch : my_string.toCharArray()) {
if (ch >= 'A' && ch <= 'Z') {
answer[ch - 'A']++; // 대문자 인덱스
} else if (ch >= 'a' && ch <= 'z') {
answer[ch - 'a' + 26]++; // 소문자 인덱스
}
}
return answer;
}
}
✅ Array[char - 'A']++;
입력 문자열에서 대문자만 골라 해당 알파벳의 빈도수(개수)를 세어 배열에 넣는 코드
answer[ch - 'A']++;
- answer 배열에서 대문자 알파벳 개수 세기
- 'A'는 0번째, 'B'는 1번째, ..., 'Z'는 25번째에 대응된다.
- 예: 'H' - 'A' → 72 - 65 = 7 → answer[7]++
✅ Array[char - 'a' + 26]++;
입력 문자열에서 소문자만 골라 해당 알파벳의 빈도수(개수)를 세어 길이 52인 int[]배열에 넣는 코드
answer[ch - 'a' + 26]++;
- 소문자 알파벳은 answer[26] ~ answer[51]에 저장됨
- 'a' - 'a' + 26 = 0 + 26 = 26 → 소문자 'a'는 26번째 칸
- 'z' - 'a' + 26 = 25 + 26 = 51 → 소문자 'z'는 51번째 칸
String.toCharArray() vs charAt(i)
실제 성능 차이는 미미하지만, 대규모 데이터 처리 시에는 charAt() 방식이 약간 더 효율적이다.
① String.toCharArray()
my_string
을char[]
로 한 번 전체 복사한 뒤, 배열 순회하는 향상된 for문이다. 메모리가 한 번 더 사용된다.- 추천상황 : 코드 가독성이 더 중요할 때
② charAt(i)
- 문자열을 복사하지 않고, 필요할 때마다 1글자씩 charAt으로 접근하는 방식으로 메모리가 절약되어 성능상 약간 유리하다.
- 추천상황 : 성능 또는 메모리 최적화시