문제
문자열을 입력받아 문자열을 구성하는 각 문자를 key로 갖는 hashMap을 리턴하는 메소드 만들기
해결
public HashMap<Character, Integer> countAllCharacter(String str) {
// 문자열이 비어있을 경우 null 리턴
if (str.isEmpty()) {
return null;
}
// 반환할 hashMap 생성
HashMap<Character, Integer> result = new HashMap<>();
// 매개변수의 문자열을 char형 배열로 변환
char[] charArray = str.toCharArray();
// Arrays.sort()를 이용하여 char 배열을 알파벳 순으로 정렬
Arrays.sort(charArray);
// char형 배열의 요소를 하나씩 꺼내기
// 향상된 for문 이용
for (char c : charArray) {
// 중복될 경우 해당 key의 value 값에 +1
if (result.containsKey(c)) {
result.put(c, result.get(c) + 1);
} else {
// 중복되지 않을 경우 key와 value 1을 hashMap에 추가
result.put(c, 1);
}
}
return result;
}
해결하기 전까지의 과정
처음에는 String을 char형 배열로 만든 다음 배열 내에서 중복을 체크하고
중복되면 value에 +1 해준 후 배열의 해당 중복된 문자 하나를 지운 후 한 칸씩 왼쪽으로 이동해주는 코드를 작성했다.
하지만 오류가 많고 문제가 배열의 길이를 축소할 방법이 없었다.
그 다음에 생각한 방법이 char형 배열을 ArrayList<Character> 형으로 만드는 방법이었다.
중복된 문자를 ArrayList의 메소드인 remove()를 이용해서 하나 제거하고 value에 +1 해주는 방법으로 했다.
이렇게 해도 함수에서 반환받은 hashMap이 index 초과 오류가 발생했다.
전부 지우고 빈 화면에서 곰곰히 생각하다가 겨우 생각났다. 😔
char형 배열로 옮긴 다음에
문자를 하나씩
hashMap의 containsKey() 메소드를 이용해서 hashMap안에 중복되 있는지 확인하고
중복되면 해당 문자 key에 value 값을 +1 하고
중복되지 않으면 map안에 없는 것이니까 새로 맵에 붙여 주면 된다.
고민하고 헤맨 것에 비해 너무 간단하고 한순간에 해결됐다..
계속 방법이 생각이 안나다가 머리속에 벼락맞은 것처럼 한순간에 생각났다. ㅋㅋㅋ
'JAVA > 해결한 문제' 카테고리의 다른 글
소수(prime number)인지 구하는 함수 구현하기 (3) | 2022.06.13 |
---|---|
CC(Coin Change, 동전교환) 알고리즘 구현하기 (0) | 2022.06.06 |
탐욕 알고리즘(Greed Algorithm) - 짐을 박스에 담는 최선의 방법 (0) | 2022.06.02 |
baekjoon-1018번 "체스판 다시 칠하기" (0) | 2022.05.29 |
baekjoon-1085번 "직사각형 탈출" 회고 (0) | 2022.05.25 |