본문 바로가기
algorithm/Programmers

[JAVA] 완주하지 못한 선수

by 이쟝 2023. 3. 28.

https://school.programmers.co.kr/learn/courses/30/lessons/42576

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

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