프로그래머스/Lv. 0(코딩 기초 트레이닝)

[프로그래머스 코딩테스트] 문자 개수 세기(Java)

Sigfriede 2023. 5. 28. 01:10

  문제 설명

  알파벳 대소문자로만 이루어진 문자열 my_string이 주어질 때, 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]
class Solution {
    public int[] solution(String my_string) {
        int[] answer = new int[52];
        for (char c: my_string.toCharArray()) {
            if(Character.isUpperCase(c)) {
                answer[c - 'A']++;
            } else {
                answer[c - 'a' + 26]++;
            }
        }
        return answer;
    }
}

  answer 배열을 생성합니다. 배열의 크기는 대소문자 개수를 모두 합친 52로 고정입니다.

  for-each문에서 toCharArray 메소드를 이용하여 my_string을 char 배열로 변환한 뒤, 문자 c가 원소를 하나씩 받습니다.

  if문에서 Character 클래스의 isUpperCase 메소드를 이용하여 문자 c가 대문자인지 아닌지 확인하고, 만약 맞다면 answer의 c - 'A'번째 원소가 1씩 증가합니다. 이는 아스키 코드를 활용하여 인덱싱하는 것입니다. 문자끼리의 계산은 char로 명시적 형변환이 없다면 숫자로 인식됩니다.

  만약 대문자가 아니라면 소문자라는 뜻이므로(알파벳 대소문자로만 이루어진 문자열이기 때문에) answer의 c - 'a' + 26번째 원소가 1씩 증가합니다. 이 문제에서는 대소문자를 구분하고, 소문자의 위치는 대문자 뒤에 위치하고 있으므로 26을 더해주어 대문자와 소문자 간 간격을 유지합니다.