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