본문 바로가기
카테고리 없음

프로그래머스 - Lv.1 완주하지못한선수 자바

by 윤뇽뇽

 

프로그래머스

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

programmers.co.kr

1. SOLUTION

HashMap 사용하는 기본문제

참여자 명단에 있지만, 완주자 명단에 없는 사람의 이름을 return하면 되기 때문에

참여자 이름을 key값으로, 해당하는 인원수를 value로 갖는 HashMap을 사용해주면 쉽게 풀 수 있다.

동명이인이 여러 명 있는 경우더라도 해당 참여자 이름의 value에 +1 해주는 식으로 HashMap을 완성 한 후

완주자 명단을 돌면서 해당 참여자의 value에 -1을 해 주면 완주하지 못 한 한 사람만 구별해 낼 수 있다.

HashMap<Integer,String> map = new HashMap<>(); 
map.put(key,value);

* HashMap 선언과 값 추가는 위와 같이 할 수 있다.

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        // HashMap 선언
        HashMap<String, Integer> dict = new HashMap<>();
        // participant 돌면서 인원수 + 1
        for (String player : participant) {
            dict.put(player, dict.getOrDefault(player, 0) + 1);
        }

String을 key값으로, Integer를 value값으로 갖는 HashMap을 정의해 주고,

participant를 for문으로 돌아보면서 참여자 이름을 HashMap에 추가 해 준다.

이 때 value값으로 인원수 + 1을 할당해 주어야 하는데, 아직 Map에 추가 되지 않은 참여자라면 0 + 1,

이미 Map에 존재하는 참여자라면 value + 1을 해 주어야 하므로 getOrDefault 메서드를 사용해주었다.

        // completion 돌면서 인원수 - 1
        for (String player : completion) {
            dict.put(player, dict.get(player) - 1);
        }

그리고 completion을 돌면서 완주자 명단에 있는 참여자의 value값에서 -1을 해 준다.

여기까지 처리되면 완주하지 못한 선수의 value만 0이 아니게 된다.

        // 인원수가 0이 아닌 사람이 정답
        for (String key : dict.keySet()) {
            if (dict.get(key) != 0) {
                answer = key;
            }
        }

HashMap의 키값을 돌면서, key에 해당하는 value값이 0이 아닌 경우가 정답이 된다.

나는 KeySet() 메소드를 사용했는데, 이렇게 key, value 값을 모두 사용해야 하는 경우에는

entrySet() 메소드를 사용하는 게 조금 더 효율적이라고 한다.

* entrySet() getKey()와 getValue()는 현재 차례의 entry 속성 값을 바로 가져오는 반면, keySet()의 get()은 HashMap을 search 해야하므로 내부에서 hashcode(), equals()등을 실행하기 때문에 효율성이 떨어진다.

        // entrySet() 사용하는 경우의 코드
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            if(entry.getValue() !=0){
                answer = entry.getKey();
                break;
            }
        }

자바로 알고리즘 풀이하기.. 쉽지않다

파이썬이였으면 그냥 냅다 딕셔너리로 구현하면 되는데 HashMap 선언하면서 좀 슬퍼짐...

2. CODE

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        // HashMap 선언
        HashMap<String, Integer> dict = new HashMap<>();
        // participant 돌면서 인원수 + 1
        for (String player : participant) {
            dict.put(player, dict.getOrDefault(player, 0) + 1);
        }
        // completion 돌면서 인원수 - 1
        for (String player : completion) {
            dict.put(player, dict.get(player) - 1);
        }
        // 인원수가 0이 아닌 사람이 정답
        for (String key : dict.keySet()) {
            if (dict.get(key) != 0) {
                answer = key;
            }
        }
        return answer;
    }
}

댓글