알고리즘/Java

programmers: 완주하지 못한 선수 (Java)

두넌 2023. 4. 15.

 

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

 

프로그래머스

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

programmers.co.kr


처음 풀이

import java.util.HashSet;
import java.util.Iterator;

class Solution {
    public String solution(String[] participant, String[] completion) {
        HashSet<String> part = new HashSet<String>();
        for(String name: participant) {
            part.add(name);
        }
        for(String name: completion) {
            part.remove(name);
        }

        Iterator iter = part.iterator();
        String answer = iter.next().toString();
        return answer;
    }
}

문제점

- participant 의 이름이 중복일때? -> 문제를 해결하지 못함


두번째 풀이

import java.util.ArrayList;

class Solution {
    public String solution(String[] participant, String[] completion) {
        ArrayList<String> part = new ArrayList<>();
        for(String name: participant) {
            part.add(name);
        }
        for(String name: completion) {
            part.remove(name);
        }
        String answer = part.get(0);
        return answer;
    }
}

문제점

- 효율성이 떨어짐


세번째 풀이

import java.util.HashMap;

class Solution {
    public String solution(String[] participant, String[] completion) {

        HashMap<String, Integer> part = new HashMap<>();

        for(String name: participant) {
            part.put(name, part.getOrDefault(name, 0) + 1);
        }

        for(String name: completion) {
            part.put(name,  part.get(name) -1);
        }

        for(String name: part.keySet()) {
            if(part.get(name).equals(1)) {
                return name;
            }
        }
        return null;
    }
}

드디어 성공!

 

해당 문제는 해시 탭에 있는것으로 보아 해시를 쓰는 것이 적절하며, 가장 효율이 좋은 방법이다

두번째 풀이에서 ArrayList로 풀이하였을 때, 문제는 맞았지만 효율성이 떨어졌기에 새로운 방법을 찾아보다가 알게 된 방식이다

먼저 HashMap을 생성하고, 참가자 배열에 있는 참가자들을 모두 HashMap에 추가해준다

 

하지만, 중복을 허용하여야 하기 때문에 HashMap에 있는 getOrDefault 메서드를 put(key, value) 부분에 사용해 주었는데

이 메서드에 대한 간단한 설명은 다음과 같다.

 

getOrDefault(key, defaultvalue) : 해당 key의 값이 존재한다면 key에 해당하는 value값을 가져와서 값을 반환하고, 존재하지 않는다면 지정한 value(Default)값을 반환한다

 

해당 HashMap의 기능은 part(key, value) 에서, key는 참가자 이름을 나타내고 value는 몇명이 있는지 나타낸다

value가 0과 1만 가지면 되는 것이 아닌, 동명이인이 있다면 2 혹은 그 이상을 가질 수 있기 때문에 앞서 말한 getOrDefault를 사용해서 사람 수를 카운트 해준다

 

마지막으로 completion(완주자) 배열에 해당하는 사람들에 매칭되는 각각의 value값을 하나씩 줄여간다면, 결국 완주자는 참가자보다 한명 더 적기 때문에 part HashMap에는 value값이 1인 사람은 한명만이 존재하게 될 것이다

 

참고로, put(key, value) 메서드는 HashMapkeyvalue쌍을 추가하는 메서드 이기도 하지만 이미 있는 key라면 value를 수정해 주는 기능도 존재하는 메서드이기 때문에 첫 for loop과 두번 째 for loop에 모두 사용되었다


Reference

https://highseekmj.tistory.com/20

 

[JAVA] MAP - getOrDefault() 이란?

Map - getOrDefault(key, Default-value) => 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환한다. 예를 들어 import java.util.*; public class Main { public static void main(String[] args) { String[] people =

highseekmj.tistory.com

 

댓글