👈 이전글
[99클럽] 99클럽 코테 스터디 1일차 TIL + Hash(해시)
99클럽 2기 | Java | Beginner
🗝 오늘의 학습 키워드 : Hash HashSet HashMap keySet()메서드 entrySet()메서드
📚 공부한 내용 본인의 언어로 정리하기
- [Programmers | Java | 해시 문제 풀이] 완주하지 못한 선수 - Solution with HashMap
- [Programmers | Java | 해시 문제 풀이] 의상 (미해결😭)
⌛ 오늘의 회고
오전에 어제 정리하지 못한 Hash관련 메서드 들을 마저 정리하고
해시 문제를 풀었더니 비기너 문제는 어렵지않게 풀렸다.
하지만 미들러 문제를 도전해봤더니 코드 실행하는 것부터 쉽지 않았다.
수많은 에러가 터지는 통에 몇시간 동안 코드 실행만이라도 되라는 마음으로 코드를 썼다.
드디어 코드가 실행되고 코드 실행에서는 모두 맞았지만
제출후 채점하기에서 4문제가 시간 초과 되어버려서
정확성: 85.7
합계: 85.7 / 100.0
만을 겨우 찍었다.
하지만 깊이 고민하고 내 코드의 문제점을 찾고 85.7점이라는 점수를 얻어서 너무 기뻤다.
그리고 어제 게더타운에서 코딩 발표하는 분들처럼 풀이를 주석으로 써보며 문제를 풀었는데
머리 속으로 푸는 것보다 문제가 더 잘 정리되고
다른 사람들에게 설명하기도 좋을 것 같다는 생각이 들었다.
💥 어떤 문제가 있었고, 나는 어떤 시도를 했는지💦*
비기너 문제보다 미들러 문제에서 에러가 엄청 터졌다.
일단은 풀이를 정리하는 것부터 쉽지 않았다.
1. HashMap, HashSet, Array 등 무엇을 사용할 지부터 고르기 쉽지 않았다.
- 코드를 써보며 부딪히는 장애물을 만나며 좀 더 적절한 객체를 추려갔다.
- HashMap과 HashSet을 사용하기로 결정
2. HashSet과 HashMap의 삽입, 삭제, 검색, 기타 메서드가 익숙하지 않았다.
- 구글링을 통해 코드 작성에 필요한 해당 객체의 메서드를 찾음.
3. 코드 실행은 되는데 한 문제는 틀리고 한 문제는 계속 돌아가고 결과가 안나옴.
- 에러 복사+붙이기로 구글링 시도하였으나 원인 찾기 실패
- 코드를 정리하다보니 자연스럽게 에러 원인 발견
HashSet의 값을 for-each문에서 하나씩 가져오는 for문에서 계속 에러가 남.
System.out.println();으로 출력값 확인- 코드 일부를 주석처리하여 어디까지 제대로 실행되는지 어디부터 에러가 나는지 확인
어떻게 해결했는지👍
1. 일단 코드를 작성해 보기.
코드를 조금씩 작성하다보니 코드 진행이 어려운 객체는 자동적으로 사용하지 않게 되었다.
2. 구글링
HashSet 메서드,HashMap 메서드를 찾아보며 코딩에 그때 그때 필요한 메서드를 쓰다보니 어느새 처음엔 낯설었던 메서드들이 조금씩 익숙해 지는 것 같았다.
3. 작성한 코드를 정리해보기
에러를 어떻게 해결해야할 지 모를 때, 코드를 정리하다보니 자연스럽게 에러부분이 찾아짐.
it.next()를 계속 쓰길래 한 변수에 저장해서 써야지라는 마음으로 코드를 다시 썼는데,
쓰다보니 if문에서 it.next()를 쓰면 다음으로 코드가 넘어가 버려서 아래 HashMap에 추가되는 값은 다다음값인 것을 깨달음.
계속 오답 뜨던 코드 실행도 정답으로 나옴.
코드 중간 처음 에러난 부분
while(it.hasNext()) {
if (!hs.contains(it.next())){
HashSet<String> nextHs = new HashSet<>();
nextHs.add(it.next());
int value = hm.get(hs) * hm.get(nextHs);
nextHs.addAll(hs);
tempHm.put(nextHs, value);
}
}
수정한 코드
while(it.hasNext()) {
String type = it.next();
if (!hs.contains(type)){
HashSet<String> nextHs = new HashSet<>();
nextHs.add(type);
int value = hm.get(hs) * hm.get(nextHs);
nextHs.addAll(hs);
tempHm.put(nextHs, value);
}
}
4. 코드를 다시 잘 읽어보기
- for-each문을 돌리고 있는 HashMapdp for-each문 안의 for문에서 값을 추가해서 에러가 난 것이었다.
- for-each문 시작부분에 새로운 HashMap을 하나 생성해 주고 for-each문 밖에서 기존 HashMap과 합쳐주어서 해결하였다.
- HashMap, HashSet, String 등 다양한 객체를 쓰다보니 내가쓰는 변수가 어떤 객체인지 제대로 파악이 안되어서 코드를 잘못 쓴 부분도 있었다.
수정한 코드
while(!hm.containsKey(allClothes)){
HashMap<HashSet, Integer> tempHm = new HashMap<>(); // 에러가 나서 임시로 생성한 HashMap객체
for (HashSet hs : hm.keySet()) { // for-each문을 돌리고 있는 hm 객체의 keySet
Iterator<String> it = allClothes.iterator();
while(it.hasNext()) {
String type = it.next();
if (!hs.contains(type)){
HashSet<String> nextHs = new HashSet<>();
nextHs.add(type);
int value = hm.get(hs) * hm.get(nextHs);
nextHs.addAll(hs);
tempHm.put(nextHs, value); // 기존에 hm 객체에 값을 바로 추가하여 에러가 났던 부분
}
}
}
// for-each문이 끝난 뒤에 tempHm의 키, 값을 추가해 줌.
for (HashSet hs : tempHm.keySet()) {
hm.put(hs, tempHm.get(hs));
}
}
💬 무엇을 새롭게 알았는지
- HashSet의 값들을 가져오려면
.iterator(), .hasNext(),next()`메서드를 사용해야 한다. - HashMap의 키 키를 모두 가져오려면,
.keySet()메서드 - HashMap의 키 값을 모두 가져오려면,
.keyValues()메서드 - HashMap의 키, 값으로 HashSet도 들어가는구나!
- for문을 돌려주고 있는 변수를 for문 안에서 변경하면 안되겠다.
💭 내일 학습할 것은 무엇인지
- 이번주 토요일 있는 SQLD 시험 준비하기
- 강의 정리하고 기출문제 풀기