https://school.programmers.co.kr/learn/courses/30/lessons/42576
HashMap
HashMap<Integer, String> map = new HashMap<>();
map.put(key, vlaue); // 값 추가
- 선언 시 HashMap에 설정해준 타입과 같은 Key와 value 값을 넣어야 되고, 만약 입력되는 키 값이 HashMap 내부에 존재한다면 기본의 값은 새로 입력되는 값으로 대치된다.
Map.get( )
파라미터로 입력받은 값이 Map에 존재하면, 입력받은 값 return, 존재하지 않으면 null return
Map.containsKey( )
map에 파라미터로 입력받은 값과 같은 값이 있으면 true 리턴
특정 key가 map에 존재하는 지 체크
getOrDeault(Object key, V DefaultValue)
찾는 키가 존재한다면 해당 key에 매핑되어있는 값을 반환하고, 없다면 기본 값을 반환하는 메서드
- key : 값을 가져와야하는 요소의 키
- deafultValue : 지정된 키로 매핑된 값이 없는 경우 반환되어야 하는 기본값
- 기존 key값의 value를 계속 사용하고 싶을 경우, getOrDefault 메서드를 사용한다.(참가자 동명이인의 중복처리)
int[] nums = { 1, 2, 3, 4, 1, 1 };
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
}
System.out.println(map);
//{1=3, 2=1, 3=1, 4=1}
entrySet(), keySet( )
map의 값을 전체 출력하기 위해 사용하는 메서드
entrySet()은 key와 value의 값이 모두 필요한 경우에 사용, keySet( )은 key값만 필요한 경우 사용
- entrySet()의 getKey()와 getValue()는 현재 차례의 entry 속성 값을 가져오지만, keySet()의 get()은 HashMa을 search해야 하므로 내부에서 hashcode(), equals()등을 실행하기 때문에 효율성이 떨어진다. => entrySet() 사용 권장
HashMap을 사용한 풀이
import java.util.HashMap;
import java.util.Map;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String, Integer> hash = new HashMap<>();
for(String player : participant) {
hash.put(player, hash.getOrDefault(player, 0)+1);
}
for(String player : completion) {
hash.put(player, hash.get(player)-1);
}
for(Map.Entry<String, Integer> entry : hash.entrySet()) {
if(entry.getValue()!= 0) {
answer = entry.getKey();
break;
}
}
// for(String s : hash.keySet()) {
// if(hash.get(s)!=0) { //0이면 중복이고, 0이 아니면 중복 아님
// answer = s;
// break;
// }
// }
return answer;
}
}
- hash.getOrDefault(s,0)+1로 +1을 추가하지 않으면 참가자 동명이인의 중복처리가 되지 않기 때문에 +1을 해줘야 된다.
- ex) for(String player : participant)의 예시
- leo일 때, hash값 {leo=1}
- kiki일 때, hash값 {leo=1, kiki=1}
- eden일 때, hash값 {leo=1, kiki=1, eden=1}
- ex) for(String s : completion)의 예시
- eden일 때, hash값 {leo=1, eden=0, kiki=1}
- kiki일 때, hash값 {leo=1, eden=0, kiki=0}
- ex) for(Map.Entry<String, Integer> entry : hash.entrySet())의 예시
- leo=1 eden=0 kiki=0
+ ArrayList를 이용한 풀이
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
Arrays.sort(participant);
Arrays.sort(completion);
for(int i=0; i<completion.length; i++) {
if(!(completion[i].equals(participant[i]))) {
return answer = participant[i];
}
// if(!(participant[i].equals(completion[i]))) {
// return answer = participant[i];
// }
}
answer = participant[participant.length-1];
return answer;
}
}
- 앞으로 두 배열에서 중복된 값을 체크 할 때 HashMap을 사용해 써보는 게 훨씬 시간복잡도도 좋은 것 같다..!
- 이중 for문을 돌리지 말고, 기준으로 할 배열을 먼저 만들고, for문으로 HashMap에 넣고 난 뒤에 나머지 배열에서 중복되면 -1을 하던지 해서 구분하면 좋은 것 같다.
'algorithm > Programmers' 카테고리의 다른 글
[JAVA] 같은 숫자는 싫어 (0) | 2023.03.29 |
---|---|
[JAVA] 전화번호 목록 (0) | 2023.03.29 |
[JAVA] 폰켓몬 (0) | 2023.03.28 |
[JAVA]숨어있는 숫자의 덧셈 (2) (0) | 2023.03.25 |
[JAVA] 이진수 더하기 (0) | 2023.03.23 |