티스토리 뷰

728x90

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

 

프로그래머스

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

programmers.co.kr

 

2018 KAKAO BLIND RECRUITMENT 1차 Level 3 문제다.

 

 

먼저 매개변수로 들어온 n, t에 맞게 t분 간격으로 n개의 버스를 생성해 bus[]에 버스 출발시간을 차례로 넣는다.

그리고 ArrayList[] 형식의 crew에 버스 시간에 맞게 크루의 도착 시간을 넣는다.

예를 들어 bus가 {540, 550, 560}이고 crew[2] 에 555가 들어가있다면,

555(9:15)에 도착한 크루가 bus[2]번(9:20)을 탑승한다는 의미다. 

이때 크루 도착 시간 순서대로 버스가 채워져야 하므로 timetable[]을 정렬해 주어야 한다.

 

timetable에 있는 크루 모두가 버스에 탑승했다면, 콘이 셔틀을 타는 가장 늦은 시간을 찾아야 한다.

가장 늦은 시간이므로 콘은 무조건 마지막 버스를 타야 한다. (입출력 예시3 처럼 시간이 중복된 경우 제외)

즉, 마지막으로 온 버스의 자리가 아직 남아있다면 마지막 버스의 출발 시간에 딱 맞춰 도착한다.

마지막으로 온 버스의 자리가 다 차있다면, 마지막 버스의 탑승한 크루 중 가장 늦게 도착한 크루보다 1분 일찍 오면 가장 늦게 탑승할 수 있다.

 

Level 3지만 어렵지 않은 문제였다.!!

 

 

 

import java.util.*;

class Solution {
    static int[] bus;
    static ArrayList<Integer>[] crew;
    
    public String solution(int n, int t, int m, String[] timetable) {
        bus = new int[n];
        crew = new ArrayList[n];
        
        for(int i=0;i<n;i++)
            crew[i] = new ArrayList<>();
        
        bus[0] = 540;
        
        for(int i=1;i<n;i++)
            bus[i] = bus[i - 1] + t;
        
        Arrays.sort(timetable);
        
        for(String str : timetable) 
            findBus(strToInt(str), n, m);
        
        int ans = getAnswer(n, m);
        return intToStr(ans);
    }
    
    static int strToInt(String str) {
        StringTokenizer st = new StringTokenizer(str, ":");
        return Integer.parseInt(st.nextToken()) * 60 + Integer.parseInt(st.nextToken());
    }
    
    static String intToStr(int m) {
        StringBuilder sb = new StringBuilder();
        if(m / 60 < 10)
            sb.append('0');
        sb.append(m / 60);
        
        m %= 60;
        sb.append(':');
        
        if(m < 10)
            sb.append('0');
        sb.append(m);
        
        return sb.toString();
    }
    
    static void findBus(int min, int n, int m) {
        // 가장 늦은 버스보다 늦게 도착했다면 아무 버스도 타지 못함
    	if(bus[n - 1] < min)
            return;
        
    	// 버스 자리가 남아있고 크루 도착 시간이 버스 도착시간과 같거나 작다면 해당 버스 탑승
        for(int i=0;i<n;i++) {
        	if(bus[i] >= min && crew[i].size() < m) {
        		crew[i].add(min);
        		break;
        	}
        }

    }
    
    static int getAnswer(int n, int m) {
    	// 마지막 버스의 자리가 비어있다면 버스 출발 시간에 도착
        if(crew[n - 1].size() < m)
            return bus[n - 1];
        
        // 마지막 버스가 다 찼다면 가장 늦게 탑승한 크루보다 1분 일찍 도착
        return crew[n - 1].get(m - 1) - 1;
    }

}
728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
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 29 30 31
글 보관함