1번부터 23번까지는 수월하게 풀었는데 24번이 정말 어려웠다. 블로깅을하며 다시한번 이해해 봐야겠다.
문제 : 문자열을 입력받아 문자열을 구성하는 각 문자(letter)를 키로 갖는 HashMap을 리턴해야 합니다. 각 키의 값은 해당 문자가 문자열에서 등장하는 횟수를 의미하는 int 타입의 값이어야 합니다.
출력 : <Character, Integer> 타입을 요소로 갖는 HashMap을 리턴해야 합니다.
주의사항 : 빈 문자열을 입력받은 경우, null을 리턴해야 합니다.
수도코드를 작성해본다.
import java.util.*;
public class Blank {
public HashMap<Character, Integer> countAllCharacter(String str) {
HashMap<Character, Integer> hashMap = new HashMap<>();
// str순회
//str.charAt(i)가 hashMap에 이미 있다면, 기존의 값을 1증가 시켜주기
///그렇지 않다면, 새로운 엔트리를 만들어주기 -> str.charAt(i)가 키, 1을 값으로 가지는 엔트리
}
}
처음에 접근했던 방법은 저번 반복문때 풀었던 문제에서 사용했던 방법으로 이중for문을 사용해,
중복을 체크하고 count에 1씩추가해주는 방법이었는데,
그러다보니 한번나온 글자는 카운트가 되지 않는다는 문제가 생겼었다.
먼저 str순회하는 코드를 작성해본다.
for(int i=0; i < str.length(); i++){
char character = str.charAt(i);
0부터 입력받는 str의길이만큼 반복한다.
char 타입의 character에다 str(0)번째부터 끝까지 순회한다.
다음으로 str.charAt(i)가 hashMap에 있다면 1을 증가시키는 코드를 작성한다.
if (hashMap.containsKey(character)){
hasMap.put(character, hashMap.get(character) + 1);
}
containsKey(key) -주어진 키가 있으면 true, 없으면 false를 리턴함.
put(key, value) - 주어진 키로 값을 저장합니다. 해당 키가 새로운 키일 경우 null을 리턴하지만, 동일한 키가 있을 경우에는 기존의 값을 대체하고 대체되기 이전의 값을 리턴함.
get(key)- 주어진 키에 해당하는 값을 리턴함.
위에서 character 에다가 str 한글자씩 대입했기 때문에 있으면 +1을 해준다.
다음으로 아닌경우, 새로운 엔트리 만들어주는 코드를 작성한다.
else hashMap.put(character, 1);
이코드가 한개만있을때 즉, 중복되지않을때 그 키에 값으로 1을 넣는것이다. 내가 막혔던 부분이 이거였다.
return str.isEmpty() ? null :hashMap;
isEmpty() - 컬렉션이 비어 있는지 확인함.
마지막으로 반환값으로 비어있으면 null을 반환하고 아니면 위에서 만든 hashMap을 반환한다.
다른분께서 처음 내가 시도했던 이중 for문을 사용해서 푸셨다하셔서 레퍼런스로 코드를 받아왔다.
if(str.length()==0) return null;
HashMap<Character, Integer> hashMap = new HashMap<>();
for(int i=0 ; i<str.length(); i++){
int count = 0;
for(int j=0; j<str.length(); j++){
if(str.charAt(i)==str.charAt(j)) count++;
}
hashMap.put(str.charAt(i), count);
}
return hashMap;
내용만 가져왔다.
'부트캠프 > 백' 카테고리의 다른 글
11.15 스레드1, JVM (0) | 2022.11.16 |
---|---|
11.14 Annotation, Lambda, Stream (0) | 2022.11.14 |
11.10 enum, 제네릭, 예외, 컬렉션 프레임워크 (0) | 2022.11.14 |
11.8 다형성 추상화 (0) | 2022.11.09 |
11.7 상속, 캡슐화 (0) | 2022.11.07 |