알파벳 대소문자로만 이루어진 문자열 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;
}
}