728x90
난이도 : Lv. 3
풀이일 : 2501201
https://school.programmers.co.kr/learn/courses/30/lessons/17678
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
아이디어
- 전체 버스 시간을 숫자로 변환해서 쉽게 비교하자
- 각 버스 시간에 버스를 타고 간 크루의 인덱스를 저장하자
- 막차에 자리가 있다면, 막차 시간에 도착하자
- 막차에 자리가 없다면 마지막 사람보다 1분 먼저 도착하자
코드
import java.util.Arrays;
class Solution {
public String solution(int n, int t, int m, String[] timetable) {
int bus = 0, crew = 0, num = 0, now = 540 - t;
boolean lastseat = true;
int[] crews = new int[timetable.length];
// 크루 도착 정보 숫자 변환 및 정렬
for (int i = 0; i < timetable.length; i++) {
crews[i] = Integer.parseInt(timetable[i].substring(0, 2)) * 60 + Integer.parseInt(timetable[i].substring(3, 5));
}
Arrays.sort(crews);
while (bus < n) { // 각 버스에 타는 크루 구하기
now += t;
num = 0;
while (crew + num < crews.length && num < m) {
if (crews[crew + num] > now) { // 현재 버스 도착 시간보다 늦게 온 사람 발견 -> 반복 중단
break;
}
num++;
if (bus + 1 == n && num == m) { // 막차에 자리 없음
lastseat = false;
}
}
crew += num;
bus++;
}
// 막차에 자리가 있다면 막차, 없다면 막차 탄 마지막 사람의 도착 시간 1분 전
int result = lastseat ? now : crews[crew - 1] - 1;
return String.format("%02d", result / 60) + ":" + String.format("%02d", result % 60);
}
}
- lastseat : 막차에 자리가 있는지 확인
- crews : 모두 숫자로 변환해 9시인 540부터 각 셔틀버스 도착시간과 비교한다. 비교를 위한 정렬 필요
- while (bus < n) : 각 버스에 타는 크루를 구해 탄 크루의 인덱스를 crew로 저장
- if (timetable[crew + num] > now) : 현재 버스 출발 시간보다 도착시간이 늦은 사람을 발견했으므로 중단 조건
- 막차면서, 탈 수 있는 사람이 다 탔으면 막차에 자리가 없다.
- 막차에 자리가 있다면 막차 시간 출력, 없다면 마지막 사람보다 1분 빨리 도착
제출 결과
느낀점
- 파이썬이랑 비교해서 왜이렇게 느리지 내가 뭔가 이상하게 코드를 짰나보다. 수정해봐야지
'알고리즘 > Lv. 3' 카테고리의 다른 글
프로그래머스 17678 셔틀버스 자바스크립트 풀이 (1) | 2025.01.21 |
---|---|
프로그래머스 17678 셔틀버스 파이썬 풀이 (0) | 2025.01.20 |
프로그래머스 12927 야근 지수 파이썬 풀이 (0) | 2025.01.20 |
프로그래머스 12907 거스름돈 자바 풀이 (1) | 2024.12.27 |
프로그래머스 12907 거스름돈 자바스크립트 풀이 (0) | 2024.12.27 |