알고리즘/JAVA

[JAVA] 완주하지 못한 선수 - 프로그래머스

야아옹 2020. 11. 13. 00:30

풀이 : 해시 파트에 있는 문제 인데 효율성이 0점 나왔다..ㅎ

1. 참여 인원에 대한 배열을 중복값을 없앤 리스트 생성

2. 리스트 인원에 대한 hashmap 에 Key 와 Value 를체크하여 값을 넣기

3. 만들어진 hashmap로 완주자를 비교하여 1이상이 된 값을 answer 에 넣고 Break

 

효율성이 엉망인 이유는 구글링을 하고 비교했을 때 이유를 알게되었다.

 -> 다중 For 문이 2개 + 중복을 없애는 Stream 구문 에의한 시간복잡도가 엄청나게 올라간것이었다..

 

package com.company;
import java.util.*;
import java.util.logging.Logger;
import java.util.stream.Collectors;

public class NoFinshMan {

    static String[] participant = {"mislav", "stanko", "mislav",  "ana"};
    static String[] completion =  {"stanko", "ana", "mislav"};
    private final static Logger LOG = Logger.getGlobal();

    public static void main(String[] args) {
        System.out.println(solution(participant,completion));
    }
    public static String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String, Integer> _hashMap = new HashMap<>();
        List<String> tempArray = Arrays.stream(participant).distinct().collect(Collectors.toList());
        int num = 0;
        for (String Item : tempArray)
        {
            for (int i = 0; i < participant.length; i++)
            {
                if (Item.compareTo(participant[i]) == 0)
                    num++;
            }
            _hashMap.put(Item, num);
            num = 0;
        }

        for (String Value : _hashMap.keySet())
        {
            for (int i = 0; i < completion.length; i++)
            {
                if (Value.compareTo(completion[i]) == 0)
                    _hashMap.replace(Value, _hashMap.get(Value) -1);
            }
            if (_hashMap.get(Value) >= 1)
            {
                answer = Value;
                break;
            }
        }

        return answer;
    }
}

 

풀이 2 진행 방식은 내가 생각한대로 와 비슷하지만 다중for 문이 없다..

         Hashmap 을 많이 사용해보지 못해서 라고 할 수는 있지만... 해쉬 관련된 문제를 많이 풀어야겠다..

package com.company;
import java.util.*;
import java.util.logging.Logger;
import java.util.stream.Collectors;

public class NoFinshMan {

    static String[] participant = {"mislav", "stanko", "mislav",  "ana"};
    static String[] completion =  {"stanko", "ana", "mislav"};
    private final static Logger LOG = Logger.getGlobal();

    public static void main(String[] args) {
        System.out.println(solution(participant,completion));
    }
    public static String solution(String[] participant, String[] completion) {
        String answer = "";
        Map<String, Integer> _hashMap = new HashMap<>();
        for (String person: participant)
        {
            if (_hashMap.get(person) == null)
                _hashMap.put(person, 1);
            else
                _hashMap.put(person, _hashMap.get(person) + 1);

        }
        for (String com_person: completion)
            _hashMap.put(com_person, _hashMap.get(com_person) - 1);

        for (String Value : _hashMap.keySet())
        {
            if (_hashMap.get(Value) >= 1)
            {
                answer = Value;
                break;
            }
        }

        return answer;
    }
}