관리 메뉴

Mini

[틀림] [자바] 프로그래머스 호텔방배정 // 유니온파인드 본문

Algorithm/유니온파인드

[틀림] [자바] 프로그래머스 호텔방배정 // 유니온파인드

Mini_96 2025. 5. 3. 15:03

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

* 시도1

분포가 sparse하네? -> vis배열대신 map으로 방문체크 시도

 

빈방이아니면, while문에서 빈방을 찾을때까지 number++ 하는 방법

import java.util.*;

class Solution {
    static HashMap<Long,Integer> m = new HashMap<>();
    static ArrayList<Long> ret= new ArrayList<>();
    
    public long[] solution(long k, long[] room_number) {
        long[] answer = {};
        // System.out.println(m.get(0)); //null
        
        for(long number : room_number){
            if(m.get(number)==null){
                m.put(number,1);
                ret.add(number);
                continue;
            }
            while(m.get(number)!=null){
                number++;
            }
            m.put(number,1);
            ret.add(number);
        }
        
        answer = new long[ret.size()];
        for(int i=0;i<ret.size();++i){
            answer[i]=ret.get(i);
        }
        return answer;
    }
}

k가 10^12 이므로 시간초과가 난다. 알고리즘이 필요하다.

 

풀이

맵을 이용한 유니온 파인드를 사용해야한다.

유니온 파인드 알고리즘을 살펴보자.

1. parent배열을 둔다.

2. 부모가 없을때까지 들어간다.

3. 부모가 없다면 내부모 = 나 + 1 로 기록

4. 자신을 리턴

5. 나오면서 리턴된값 + 1 을 부모로 기록해놓기

유니온 파인드의 find 시간복잡도는 거의 상수시간이다.

코드만 보고 이해하기 쉽지 않아서, 그림을 그려보며 해봐야 한다.

import java.util.*;

class Solution {
    static HashMap<Long,Long> m = new HashMap<>();
    static ArrayList<Long> ret= new ArrayList<>();
    
    long find(long x){
        //방이 빈경우, 방번호+1을 다음방으로하고, 방번호 리턴
        if(m.get(x)==null){
            m.put(x,x+1);
            return x;
        }
        
        long nxt = find(m.get(x));
        m.put(x,nxt+1);
        return nxt;
    }
    
    public long[] solution(long k, long[] room_number) {
        long[] answer = {};
        // System.out.println(m.get(0)); //null
        
        for(long number : room_number){
            long n = find(number);
            ret.add(n);
        }
        
        answer = new long[ret.size()];
        for(int i=0;i<ret.size();++i){
            answer[i]=ret.get(i);
        }
        return answer;
    }
}