
알파벳 대소문자로만 이루어진 문자열 my_string이 주어질 때, my_string에서 'A'의 개수, my_string에서 'B'의 개수,..., my_string에서 'Z'의 개수, my_string에서 'a'의 개수, my_string에서 'b'의 개수,..., my_string에서 'z'의 개수를 순서대로 담은 길이 52의 정수 배열을 return 하는 solution 함수를 작성해 주세요.
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] |
입출력 예 #1
예제 1번의 my_string에서 'P'가 1개, 'a'가 1개, 'e'가 1개, 'g'가 1개, 'm'이 2개, 'o'가 1개, 'r'가 3개, 's'가 1개 있으므로 [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]를 return합니다.
저는 아래의 알고리즘으로 문제를 해결하였습니다.
대소문자의 길이만큼 answer 배열을 선언합니다.
my_string을 char 배열로 변환하여 c로 하나씩 가져옵니다.
c가 대문자일 경우'A'만큼 뺀 인덱스의 answer값을 1 증가시킵니다.
c가 소문자일 경우 'A'+6만큼 뺀 인덱스의 answer값을 1 증가시킵니다.
이렇게 1차 코드를 완성했지만 숫자로 표현되어 있는 점과 코드의 중복에서 가독성이 좋지 않다는 것을 느꼈습니다.
이에 3, 4번을 변경하여 조금 더 간결화된 코드를 작성하였습니다.
c에서 A를 빼줌으로써 인덱스가 0부터 시작하게 되었습니다. 하지만 소문자에서 A를 뺀다면 원래 있어야 할 인덱스보다 6칸이 뒤로 밀리게 됩니다.
(c >= 'a' ? 6 : 0) - 따라서 c가 소문자이면 6을, c가 대문자이면 0을 빼주었습니다.
이렇게 2차 코드까지 리팩토링을 완료하였습니다.
1차
class Solution {
public int[] solution(String my_string) {
int[] answer = new int[52];
for ( char c : my_string.toCharArray() ) {
if ( c < 97 )
answer[c-65]++;
else
answer[c-71]++;
}
return answer;
}
}
2차
class Solution {
public int[] solution(String my_string) {
int[] answer = new int[52];
for ( char c : my_string.toCharArray() ) {
answer[(int)(c-'A') - (c >= 'a' ? 6 : 0)]++;
}
return answer;
}
}
