알고리즘이 재미있다

[프로그래머스] [1차]셔틀버스(java) 본문

카테고리 없음

[프로그래머스] [1차]셔틀버스(java)

javajohaha 2023. 8. 24. 12:39

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분 더 빨리 와야 한다.

반대로 아직 자리가 있다면 출발시간에 맞춰서 도착하면 된다.

 

이제 이를 형식에 맞게 반환하면 된다.

 

 

배운 점 

사실 어렵지 않은 문제라고 생각한다. 처음 설계를 잘해 둔덕분에 한 번에 맞출 수 있었다.

처음 설계를 하면서 예외가 무엇이 있을까에 대한 생각을 하면서 접근하면 실수를 방지할 수 있다고 느꼈다.

또한 내 설계를 시뮬레이션을 돌리며 반례가 있을지에 대한 생각도 미리 하는 것이 좋다고 생각된다.