문자열을 입력받아 문자열의 각 letter를 key로 갖고 letter가 등장하는 횟수를 value로 갖는 HashMap<Character, Integer> 를 return 하는 문제. (입력받은 문자열이 빈 문자열인 경우에는 return null)
예시. "apple" 을 입력받았다면 {a = 1, p = 2, l = 1, e = 1} 을 반환
나의 풀이
또 다시 완전 탐색과 double for loop으로..ㅎㅎ
그래도 나름대로 중복된 key는 갖지 않는 Map의 특성을 이용했다는 점에서, 그 동안 사용해 보지 않은 새로운 방식을 하나 이용했다는 게 성장점인 것 같다. 물론 return type 자체가 HashMap인 것도 있지만!
public HashMap<Character, Integer> countAllCharacter(String str) {
//TODO..
if(str.isEmpty()) {
return null;
}
char[] charArr = str.toCharArray();
int[] duplicatesArr = new int[charArr.length];
//등장 횟수 찾기
for(int j = 0; j < charArr.length; j++) {
int count = 0;
for(int a = 0; a < charArr.length; a++) {
if(charArr[j] == charArr[a]) {
count += 1;
}
}
duplicatesArr[j] = count;
}
//Return 할 HashMap 만들기
HashMap<Character, Integer> answer = new HashMap<>();
for(int i = 0; i < charArr.length; i++) {
answer.put(charArr[i], duplicatesArr[i]);
}
return answer;
}
언어 마다 내장 method를 잘 알고 있으면 조금 더 편하게 알고리즘을 구성할 수 있는 것 같다.
아래는 다른 풀이인데,
key가 이미 사용되고 있는 key인지 아닌지 여부를 확인하고 그에 따라 나누어 코드를 작성하였다.
public HashMap<Character, Integer> countAllCharacter(String str) {
if (str.isEmpty()) {
return null;
}
HashMap<Character, Integer> hashMap = new HashMap<>();
for (int i = 0; i < str.length(); i++) {
char curChar = str.charAt(i);
if (hashMap.containsKey(curChar)) {
//key가 이미 있는 경우에는 value에 +1을 해주어 count를 높여주는 효과를 줌
int value = hashMap.get(curChar);
hashMap.put(curChar, value + 1);
} else {
//key가 없는 경우에는 key를 넣어주고 초기 value로 1을 넣어줌
hashMap.put(curChar, 1);
}
}
return hashMap;
}
single for loop이기 때문에 훨씬 속도가 빠를 것이라 예상된다.
시사점
- String에는 .charAt(i)을 사용해서 i번째 index에 있는 character를 반환받는 method가 있다.
- hashMap에 해당 key가 없는 경우에는 key를 넣어주고 value를 1로 넣어줌.
- hashMap에 해당 key가 이미 있는 경우에는 value에 +1을 해주어 count를 높여주는 효과를 줌.
반응형