string (1)

 

문제

 

문자열을  입력받아 문자열을 구성하는 각 문자를 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안에 없는 것이니까 새로 맵에 붙여 주면 된다.

고민하고 헤맨 것에 비해 너무 간단하고 한순간에 해결됐다.. 

계속 방법이 생각이 안나다가 머리속에 벼락맞은 것처럼 한순간에 생각났다. ㅋㅋㅋ

 

 

 

 

 

1