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;
}
}
## 여담
풀이 후 다른 사람들의 풀이를 보니, 우선순위큐를 이용해서 많이들 풀었다.
우선순위큐로 방의 갯수를 관리하고, 퇴실 시간 기준으로 정렬을 유지한다.
내가 짠 로직 자체는 일반적으로 푼 풀이와 비슷한 것 같아 보인다.
'코테' 카테고리의 다른 글
[프로그래머스/LV2] 귤 고르기 (1) | 2024.09.17 |
---|---|
[백준/브론즈1] 2775번: 부녀회장이 될테야 (0) | 2022.12.07 |
[백준/브론즈2] 2309번: 일곱 난쟁이 (0) | 2022.11.17 |
[프로그래머스/LV2] 주식가격(Stack) (0) | 2022.07.12 |
[프로그래머스/LV2] 타겟 넘버(DFS) (0) | 2022.07.11 |