문제

제한사항

입출력 예 

ret : 3

풀이

import java.util.*;
class Solution {
	/*
    * 시간을 모두 분단위로 바꿈 
    * 종료시간은 청소해야되니까 +10분 
    */
    public int[] HtoM(String[] hour){
        int[] ret = new int[2]; 
        StringTokenizer stk ;
        for(int i =0 ; i <2; i ++){
            stk = new StringTokenizer(hour[i],":");
            ret[i] = 60*Integer.parseInt(stk.nextToken()); 
            ret[i] += Integer.parseInt(stk.nextToken()) + i*10; 
        }
        return ret;
    }
    
    public int solution(String[][] book_time) {
        int answer = 0;
               
        int[][] timeLine = new int[book_time.length][2];
        int i = 0; 
        for(String[] book : book_time){
            timeLine[i++] = HtoM(book);
        }
        
        // 입실 시간을 기준으로 정렬 
        Arrays.sort(timeLine, new Comparator<int[]>(){
            @Override
            public int compare(int[] a1, int[] a2){
                return a1[0] == a2[0] ? a1[1]-a2[1] : a1[0]-a2[0];
            }
        });
        
        // 퇴실시간이 빠른것부터 퇴실
        PriorityQueue<int[]> pq = new PriorityQueue<>((o1,o2)->{
            return o1[1] == o2[1] ? o1[0]-o2[0] : o1[1] - o2[1];
        });
        
        int cnt = 0; // 현재 방 갯수 
        int maxCnt = 0; // 최대였던 방 갯수 
        
        for(int[] time : timeLine){
            int[] last;
            while(!pq.isEmpty()){
                last = pq.poll(); 
                cnt -=1;
                if(time[0] < last[1]){
                // 가장 빠른 퇴실시간이 지금 손님 입실시간보다 느리면 방 추가.
                    pq.add(last);
                    cnt+=1;
                    break; 
                }
            }
            pq.add(time); 
            cnt+=1;
            maxCnt = Math.max(cnt,maxCnt);
        }
        return maxCnt;
    }
    
    /**
    * 디버깅용 print function
    */
    public void sysout(int[] a){
        System.out.println(""+a[0] + " "+ a[1]);
    }
}

 

 

느낀점 - "파이썬 VS 자바"

자바로 알고리즘을 안푼지 오래돼서 세미콜론때매 자꾸 오류가 났다;

프로그래머스는 자동완성도 안되니까 죽을맛이다.

 

알고리즘 문제를 풀 때 파이썬이 훨씬 편하다. 

 

예를들어 위 문제에서 2차원 배열을 0번 index기준으로 정렬할때

자바는 아래와 같이 정렬할 수 있다.

Arrays.sort(arr, new Comparator<int[]>({

    @Override
    public int compare(int[] o1, int[] o2){
    	return o1[0]==o2[0] ? o1[1]-o2[1] : o1[0]-o2[1];
    }
    
}));

파이썬은 아래와 같이 정렬할 수 있다. 

arr.sort(key= lambda x : x[0])

 

 

자바에서 저거보다 쉽게 2차원 배열을 정렬하는 법 있으면 알려주세여,.

 

 

우선순위큐도 역시 파이썬이 간단하다

위에 문제처럼 timeline 배열의 1번인덱스 변수를 기준으로 최소힙을 사용하고 싶다면

자바는 아래와 같이 pq를 만든 후 add를 진행하면 된다. 

PriorityQueue<int[]> pq = new PriorityQueue<>((o1,o2)->{
	return o1[1] == o2[1] ? o1[0] - o2[0] : o1[1] - o2[1]; 
});

pq.add(new int[]{1,2});
pq.add(new int[]{2,3});

 

 

 

 

파이썬은 heapq 모듈을 아래와 같이 사용하면 된다. 

arr =[] 
heapq.heappush(arr, (a[1],a))
heapq.heappush(arr, (b[1],b))

_, first = heapq.heappop(arr)
_, second = heapq.heappop(arr)

 

 

번외로 최소힙이 아닌 최대힙을 만들고 싶다면 자바는 lambda 식의 파라미터로 들어온 o1, o2중 뒤의 값에서 앞의 값을 빼면 된다. 

PriorityQueue<int[]> pq = new PriorityQueue<>((o1,o2)->{
	return o1[1] == o2[1] ? o2[0] - o1[0] : o2[1] - o1[1]; 
});

 

파이썬은 최대힙을 만들기 위해 음수를 한 번 곱해준다. 

arr =[] 
heapq.heappush(arr, (-a[1],a))
heapq.heappush(arr, (-b[1],b))

_, first = heapq.heappop(arr)
_, second = heapq.heappop(arr)

 

 


 

다음은 자바 익명객체하고 무중단배포 포스팅해야쥐ㅣㅇ

 

 

+ Recent posts