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

 

프로그래머스

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

programmers.co.kr

 

## 문제 풀이법

내가 푼 문제 풀이법을 요약하자면

1. 시작시간을 기준으로 오름차순 정렬
2. 가장 빠른 시작 시간의 예약은 방 1개 줌
3. 다음 시작 시간부터 비교(청소시간 +10분) - 배열만큼 반복문 수행
  3-1. 가장 빨리 끝나는 방의 종료시간이 다음 예약의 시작 시간 이전이거나 같으면 종료시간을 다음 예약의 종료 시간으로 업데이트  
  3-2. 위의 경우가 아닐 경우 사용 가능한 방이 없으므로 방+1
  3-3. 종료시간을 저장한 리스트를 가장 빨리끝나는 종료시간 순으로 정렬
4. 최종 리스트의 사이즈가 방의 갯수

위의 풀이에서 주의 해야 할 것은 나는 문제의 입력값인 String[][]값을 시간 데이터로 변환하기 위해

Java의 LocalTime 형타입을 썼는데, 이 때 청소시간 10분을 더한 값을 list에 넣어버리면 

자정에 거의 가까운 시간들은 0시로 넘어가 버리기때문에 list에 저장하는 값들은 endTime 그대로 저장하고,

비교할 때 10분을 더해서 비교하게끔 하였다. 

ex) 12:58 -> 00:08 가 되고, 가장 이른 시간 순으로 배열을 정렬하기 때문에 실패하는 케이스 발생

## 코드

import java.util.ArrayList;
import java.time.LocalTime;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Collections;

class Solution {
	public int solution(String[][] book_time) {
		int answer = 1;
		ArrayList<LocalTime> rooms = new ArrayList<>();
		//시작시간에 따라 정렬
		Arrays.sort(book_time, new Comparator<String[]>() {
			@Override
			public int compare(String[] row1, String[] row2) {
				LocalTime time1 = LocalTime.parse(row1[0]);
				LocalTime time2 = LocalTime.parse(row2[0]);
				return time1.compareTo(time2);
			}
		});

		for(String[] row : book_time){
			LocalTime startTime = LocalTime.parse(row[0]);
			LocalTime endTime = LocalTime.parse(row[1]);
			//가장 빠른 시작 시간의 예약 - 방 사용
			if(rooms.isEmpty()){
				rooms.add(endTime);
				continue;
			}

			//ArrayList에 LocalTime + 10분 한 값 넣을 시 자정이 넘어가 버리므로 비교할때 10분을 더한다.
			LocalTime compareTime = rooms.get(0).plusMinutes(10);
			//방이 사용가능하면 방을 넘겨주고 끝나는 시간 업데이트
			if(compareTime.isBefore(startTime) || compareTime.equals(startTime)){
				rooms.remove(rooms.get(0));
				rooms.add(endTime);
			//방이 사용가능하지 않으면 새로운 방 리스트를 저장한뒤, 끝나는 시간을 기록한다.
			}else{
				rooms.add(endTime);
			}
			//저장한 값들을 끝나는 시간 우선으로 오게끔 정렬
			Collections.sort(rooms);

		}
		//루프가 끝난뒤 배열의 사이즈가 사용하는 방의 갯수
		answer = rooms.size();
		return answer;
	}
}

 

## 여담

풀이 후 다른 사람들의 풀이를 보니, 우선순위큐를 이용해서 많이들 풀었다.

우선순위큐로 방의 갯수를 관리하고, 퇴실 시간 기준으로 정렬을 유지한다.

내가 짠 로직 자체는 일반적으로 푼 풀이와 비슷한 것 같아 보인다.

+ Recent posts