youngik

해시 (완주하지 못한 선수) 본문

programmers

해시 (완주하지 못한 선수)

youngik 2021. 4. 9. 19:29

먼저 위 문제를 분석을 해보았을 때,

1. participant의 수가 항상 completion+1이다.

2. 동명이인이 없을 때에는 participant에서는 존재하지만 completion에 없는 String 출력

3. 동명이인이 있을 때에는 participant의 동일인물의 이름을 카운트해서, completion 동일인물의 이름의 카운트와

   비교를 해서 같지 않는 String 출력

 

처음에는 배열로 위 문제를 만들었었는데, 정답은 맞았지만 효율성 문제에서 통과하지 못했다ㅠ

2중 반복문을 썻기 때문에 100,000 * 100,000번의 연산이 들어가서 그런 것 같다. 

 

그래서 위 문제가 해쉬에 포함이 되기 때문에 Hashmap로 다시금 코드를 작성했다. 

Hashmap는 (key, value)의 쌍으로 들어가는 값이고,, 해당 key를 조회해서 value값을 불러오거나

길이 등등 다양한 method들을 이용할 수 있다. (*생각보다 쓰일 곳이 많다. 필수로 알기!!)

 

*기초적인 method

put() = {key, value}쌍으로 Hashmap에 삽입하는 함수

size() = Hashmap 크기 출력

clear() = Hashmap 비우기

values() = Hashmap 내에 있는 {value}값을 불러옴

keySet() = Hashmap 내에 있는 {key}값을 불러옴

get([key]) = Hashmap 내 key에 해당하는 value값을 불러옴

getOrDefault(Object key, defalutValue) = key값에 해당하는 value를 불러오고, key가 없을때에는 defaultValue값으로 불러옴.

 

*출처 : (오라클 java) docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

 

동일한 HashMap값을 어떻게 count를 할까? 고민을 많이 했었는데,, (=> HashMap은 key 중복 허용을 하지 않음)

위 getOrDefault를 이용해서 동일한 key의 값을 count해서 HashMap에 넣는 방법이 있었다.

 

 

출처 : https://velog.io/@w-beom/Java-HashMap%EC%9D%98-getOfDefault-%EC%A4%91%EB%B3%B5-%EA%B0%AF%EC%88%98-%ED%99%95%EC%9D%B8

위 코드를 보면 쉽게 이해가 갈 것이다. map에 put할 때, 해당 value값을 불러오고

만약 없다면 (key = 1)로 해서 집어놓고 동일한 값이 있을때는 value값을 불러오고 +1을 해서 넣어주는 방식으로 구현한다.

 

다시 코드를 작성했을 때, participant와 completion Hashmap을 각각 2개로 만들어서 구현을 했는데,

효율성에서 1번을 통과하지 못했다,,, (*무엇이 문제인가,,,)

그래서 다른 분들이 작성한 일부 코드를 봤었는데

completion에 이름이 있을 때마다 Hashmap에 key(이름)의 value(중복값)을 -1씩 하는 것이다.

이렇게하면 중복된 이름이 없을 때에도, 완주하지 못한 사람의 이름(key)의 value가 1이 되고

중복된 이름이 있을 때에도, 완주하지 못한 사람의 이름(key)의 value가 1이 된다.

 

역시,, 문제를 좀 더 해석하는 능력과 직관적으로 이해하는 부분이 많이 부족하다고 느꼈다.

위의 방법으로 다시 코드를 작성했을 때, 마지막 효율성 문제도 통과했다.

생각보다 코드도 몇 줄 되지도 않아서ㅎㅎ,,, 공부 더 열심히하자!!!

'programmers' 카테고리의 다른 글

힙 (더 맵게)  (0) 2021.04.12
해시 (위장)  (0) 2021.04.10
해시 (전화번호 목록)  (0) 2021.04.09
완전탐색 (모의고사)  (0) 2021.04.07
스택/큐 (프린터)  (0) 2021.04.07
Comments