본문 바로가기
코딩테스트 연습

문자 개수 세기

by 신재은👩🏼‍💻 2024. 4. 24.

문제 설명

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

import java.util.*;

class Solution {
    public int[] solution(String my_string) {
        Map<Character, Integer> numberStates = new HashMap<>();
        for(char c = 'A'; c<='Z'; ++c) {
            numberStates.put(c,0);
        }
        for(char c = 'a'; c<='z'; ++c) {
            numberStates.put(c,0);
        }
        
        for(char ch : my_string.toCharArray()) {
            numberStates.put(ch, numberStates.get(ch) + 1);
        }
        
        int[] answer = new int[52];
        int idx = 0;
        for(char c = 'A'; c <= 'Z'; ++c) {
            answer[idx++] = numberStates.get(c);
        }
        for(char c = 'a'; c <= 'z'; ++c) {
            answer[idx++] = numberStates.get(c);
        }
        
        return answer;
        
        
    }
}


요즘엔 코드에 대한 고민을 좀 하게 된다.

코테는 고사하고 코드를 한 줄도 적을 수 없어요 > 와! 뭔가 누덕누덕 기울 수 있어요! > 오... 잘 모르지만 뭐든, 어떻게든, 돌아가게 할 수 있어요 > 그렇게 지금 단계에 왔는데...

지금은 뭔갈 '풀 수'는 있는데 코드가 뭔가 '이상'하다.

for문을 다섯 번 돌리는 게 말이 되나...?

근데 일단 매일 코테 문제를 6개 정도 풀다 보니까 생각을 오래, 깊이 할 에너지가 없다.

그러다 보니 수도코드처럼 일단 줄줄 쓰고 제출한다.

틀리면 다시 좀 고치고 제출하고.

 

이것 외에 다른 접근 방법은 없을지, 코드를 더 줄일 수 있을지, 성능을 개선할 수 있을지, 그런 부분에 대해

생각을 할 여유가 없다.

캐파가 안 되는 걸 수도 있겠다.

 

일단 통과 후 다른 사람의 풀이를 보니...

나랑 너무 다르다.

최상단에 있는 코드가 나와 다른 건 충분히 이해가 되는데, 최신 코드가 나랑 많이 다른 건

좀 위험하다고 느꼈다.

 

이리 보고 저리 봐도 for문을 다섯개나 돌린 코드는 못 봤다.


맨 위에서 3개 정도만 가져 와 본다.

class Solution {
    public int[] solution(String my_string) {
        int[] answer = new int[52];
        for(int i = 0; i < my_string.length(); i++){
            char c = my_string.charAt(i);
            if(c >= 'a')
                answer[c - 'a' + 26]++;
            else
                answer[c - 'A']++;
        }
        return answer;
    }
}

class Solution {
    public int[] solution(String my_string) {
        int[] answer = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

        for(char ch: my_string.toCharArray()) {
            answer[ch - 'A' - (Character.isLowerCase(ch)?6:0)]++;
        }
        return answer;
    }
}
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

class Solution {
    public int[] solution(String my_string) {
        return IntStream.concat(IntStream.concat(my_string.chars(), IntStream.rangeClosed('A', 'Z')), IntStream.rangeClosed('a', 'z'))
                .mapToObj(Character::toString)
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
                .values().stream()
                .mapToInt(i ->  i.intValue() - 1)
                .toArray();
    }
}

 

3번 째 코드는 그렇게 좋다고 보기는 어려울 것 같으나 뭐... 그건 그렇다 치고.

for문 다섯 번 돌린 내 방식보단 낫지 않을까...?

 

이 문제도 포스팅 할 필요 없는 매우 단순한 문제라고 생각했는데

남의 답 확인하는 과정에서 자괴감 느껴서 기록으로 남긴다.

'코딩테스트 연습' 카테고리의 다른 글

정사각형으로 만들기  (0) 2024.04.25
소인수분해  (0) 2024.04.24
정수 제곱근 판별  (0) 2024.04.24
최댓값과 최솟값  (0) 2024.04.24
조건에 맞게 수열 변환하기 2  (0) 2024.04.22