문제
제한사항
입출력 예
풀이
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)
다음은 자바 익명객체하고 무중단배포 포스팅해야쥐ㅣㅇ