[Programmers] 문자 개수 세기 (Java)

Haeun Noh·2024년 4월 22일
0

programmers

목록 보기
64/64
post-thumbnail

0418


문제 설명

알파벳 대소문자로만 이루어진 문자열 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_stringresult
"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합니다.



문제풀이

저는 아래의 알고리즘으로 문제를 해결하였습니다.

  1. 대소문자의 길이만큼 answer 배열을 선언합니다.

  2. my_string을 char 배열로 변환하여 c로 하나씩 가져옵니다.

  3. c가 대문자일 경우'A'만큼 뺀 인덱스의 answer값을 1 증가시킵니다.

  4. c가 소문자일 경우 'A'+6만큼 뺀 인덱스의 answer값을 1 증가시킵니다.

    • 대문자와 소문자 사이의 6개의 특수기호들 때문에 간극을 없애기 위해 6을 빼주었습니다.

이렇게 1차 코드를 완성했지만 숫자로 표현되어 있는 점과 코드의 중복에서 가독성이 좋지 않다는 것을 느꼈습니다.


이에 3, 4번을 변경하여 조금 더 간결화된 코드를 작성하였습니다.

  1. c에서 A를 빼줌으로써 인덱스가 0부터 시작하게 되었습니다. 하지만 소문자에서 A를 뺀다면 원래 있어야 할 인덱스보다 6칸이 뒤로 밀리게 됩니다.

  2. (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;
    }
}


출력결과



profile
기록의 힘을 믿는 개발자, 노하은입니다!

0개의 댓글