본문 바로가기
Computer Science/Problem Solve

2018 카카오 블라인드 채용 - [1차] 셔틀버스

by snfjddl 2021. 8. 16.

 

문제 설명
제한사항

문제 해석

해당 문제는 구현 문제입니다. 문제에서 주어진 힌트와 제한사항을 바탕으로 아래와 같이 발생 가능한 상황을

시간 순서대로 분류했습니다.

  1. 버스 운행시간 이전(~09:00) 탑승대기 크루의 수 >= 최대 운행 가능한 사람 수
  2. 버스 운행 시작 이후(09:00~) 버스가 모두 돌기 전에 탑승 대기 크루의 수 >= 최대 운행 가능한 사람 수
  3. 버스 운행이 종료된 시점에 탑승 대기 크루의 수 == 최대 운행 가능한 사람 수
  4. 버스 운행이 종료된 시점에 탑승대기 크루의 수 < 최대 운행 가능한 사람 수

풀이

최초에 문제에 대한 명확한 정의를 하지 않고 코드부터 작성했을 때 2시간이 걸려도 풀지 못했는데

정의를 완벽히 마치고 풀이에 들어 갔을 때는 30분 만에 해결이 됐습니다.

 

구현 문제에서는 문제에 대한 "명확한 명세"를 먼저 작성하고 코드를 작성하는 것이 

가장 중요하다고 다시금 느꼈습니다.

 

코드

class Solution {
    public String lastTime(int hour,int min,int crueNum,int maximum,int[][] timesCnt) {
        String rtn="";
        String hStr="", mStr="";
        boolean flag = false;
        int m = min;
        
        for(int h=hour ; h>=0 ; --h) {
            if(flag)    break;
            while(m >= 0) {
                crueNum -= timesCnt[h][m];
                m--;
                
                if(crueNum <= maximum) {
                    rtn = makeTime(h, m);
                    flag = true;
                    break;
                }
            }
            m = 59;
        }
        
        return rtn;
    }
    
    public String makeTime(int hour, int min) {
        String hStr="", mStr="";
        
        if(min < 0) {
            mStr = "59";
            hour--;
        } else if(min >= 0 && min < 10) {
            mStr = "0"+min;
        } else {
            mStr = min+"";
        }

        if(hour >= 0 && hour < 10) {
            hStr = "0"+hour;
        } else {
            hStr = hour+"";
        }
        
        return hStr+":"+mStr;
    }
    
    
    public String solution(int n, int t, int m, String[] timetable) {
        String answer = "";
        int[][] timesCnt = new int[24][60];
        for(String str : timetable) {
            int hour = Integer.parseInt(str.substring(0,2));
            int min = Integer.parseInt(str.substring(3));
            timesCnt[hour][min]++;
        }
        
        int crueNum = 0;
        int maximum = n*m;
        boolean flag = false;
        // 9시 까지 탑승자리가 남아있을지 탐색
        for(int hour=0 ; hour<9 ; ++hour) {
            if(flag)
                break;
            for(int min=0 ; min<60 ; ++min) {
                crueNum += timesCnt[hour][min];
                if(crueNum >= maximum) {
                    answer = lastTime(hour, min, crueNum, maximum, timesCnt);
                    flag = true;
                    break;
                }
            }
        }
        
        // 9시까지 탑승 자리가 남아있다면 배차 시작
        int count=0;
        if(answer.equals("")) {
            flag = false;
            
            for(int hour=9 ; hour<24 ; ++hour) {
                if(flag)   break;
                for(int min=0 ; min<60 ; ++min) {
                    crueNum += timesCnt[hour][min];
                    if(count % t == 0) {    // 버스 도착
                        if(n > 1) {         
                            crueNum = crueNum >= m ? crueNum-m : 0;    
                        } else {            // 막차 
                            crueNum -= m;   
                        }
                        maximum -= m;    
                        n--;
                    }
                    
                    if(n > 0 && crueNum >= maximum) {
                        answer = lastTime(hour, min, crueNum, maximum, timesCnt);
                        flag = true;
                        break;
                    } else if(n == 0) {
                        if(crueNum >= maximum) {
                            answer = makeTime(hour, min-1);
                        } else {
                            answer = makeTime(hour, min);
                        }
                        flag = true;
                        break;
                    }
                    count++;
                }
            }
        }
        
        return answer;
    }
}

 

문제 출처: 프로그래머스(https://programmers.co.kr/learn/courses/30/lessons/17678)

반응형

댓글