일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- PCCP
- BFS
- Heap
- 847
- 구현
- 미로 탈출 명령어
- 알고리즘
- 셔틀버스
- reconstruct itinerary
- Eliminate Maximum Number of Monsters
- 리트코드
- n+1카드게임
- 백준
- SW아카데미
- Shortest Path Visiting All Nodes
- Number of Flowers in Full Bloom
- 백트래킹
- 2251
- 표편집
- 주사위 고르기
- Java
- leetcode
- 프로그래머스
- 소셜 광고
- DFS
- 자바
- 양궁대회
- 카드 짝 맞추기
- 332
- 주사위고르기
Archives
- Today
- Total
알고리즘이 재미있다
[프로그래머스] [1차]셔틀버스(java) 본문
https://school.programmers.co.kr/learn/courses/30/lessons/17678
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
구현문제이며 상당히 재미있는 문제라고 생각된다.
핵심
우선 내가 처음 시작 전 설계를 한 주석이다.
/**
* pq를 만들어서 timetable의 데이터를 분단위로 바꿔서 넣어줌
* 시작시간 9시 부터 t간격으로 n번 timetable의 데이터가 시간보다 작거나 같으면 poll해줌 최대 m까지
* 만약 m이 전부 가득차면 마지막 뺀시간의 -1을 저장, m이 가득안차면 출발시간을 저장
*/
사실 단순 구현이기에 아이디어만 잘 생각하면 쉽게 풀 수 있다.
구현 단계도 주석에 적힌 대로 설계하면 쉽게 풀 수 있다.
정답 코드
import java.util.PriorityQueue;
class Solution {
private int result = 0;
public String solution(int n, int t, int m, String[] timetable) {
PriorityQueue<Integer> times = new PriorityQueue<>();
for (String time : timetable) {
String[] info = time.split(":");
times.offer(Integer.parseInt(info[0]) * 60 + Integer.parseInt(info[1]));
}
for (int i = 0; i < n; i++) {
int startTime = (9 * 60) + (i * t);
int minTime = 0;
int pollCount = 0;
for (int j = 0; j < m; j++) {
if (!times.isEmpty() && times.peek() <= startTime) {
minTime = times.poll();
pollCount++;
}
}
if (pollCount == m) {
result = minTime - 1;
} else {
result = startTime;
}
}
String hour = String.valueOf(result / 60);
String min = String.valueOf(result % 60);
return (hour.length() == 1 ? "0" : "") + hour + ":" + (min.length() == 1 ? "0" : "") + min;
}
}
해설
시간정보를 분단위로 바꾸어서 처리하는 것이 편하다고 생각하여 시간에 60을 곱하여 분단위로 설정해 주었다.
이후 버스는 n번 t간격으로 오기 때문에 출발시간을 첫 9시 + i * t로 설정해 주었다.
중요한 부분은 만약 m명의 사람이 탈 수 있기에 만약 m명의 대기자가 있다면 마지막 사람보다 1분 더 빨리 와야 한다.
반대로 아직 자리가 있다면 출발시간에 맞춰서 도착하면 된다.
이제 이를 형식에 맞게 반환하면 된다.
배운 점
사실 어렵지 않은 문제라고 생각한다. 처음 설계를 잘해 둔덕분에 한 번에 맞출 수 있었다.
처음 설계를 하면서 예외가 무엇이 있을까에 대한 생각을 하면서 접근하면 실수를 방지할 수 있다고 느꼈다.
또한 내 설계를 시뮬레이션을 돌리며 반례가 있을지에 대한 생각도 미리 하는 것이 좋다고 생각된다.