알고리즘/프로그래머스

LEVEL 3 : 셔틀버스

webmaster 2021. 12. 7. 23:37
728x90

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

 

코딩테스트 연습 - [1차] 셔틀버스

10 60 45 ["23:59","23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59"] "18:00"

programmers.co.kr

 

  • 문제
    • 문제 1
    • 출력 예시

 


풀이

  • 개인적으로 상당히 까다로웠던 문제이다.
  • 시간과 분을 저장한 Time클래스를 담는 우선순위 큐에 모든 데이터를 저장한다. 
    • 시간이 다르면 시간이 작은 순으로, 시간이 같다분 분이 작은 순으로 우선순위를 높게 부여한다.
    • Time 클래스의 생성자에 비지니스 로직
      • 분(Mitune)이 0 보다 작을 경우 시간-1, 분 + 60 
      • 분(Mitune)이 60보다 클경우 시간 + 1, 분 - 60
  • counting 메서드
    • 여기서의 핵심 로직은 마지막 탈 수 있는 버스까지 왔을 때, 버스가 꽉 차 있을 경우랑 꽉 차 있지 않을 경우로 나누는 것이다.
      • 만약 버스가 꽉 차 있을경우 Corn이 타기 위해서는 마지막으로 버스에 탑승한 사람을 도착시간 -1분을 해주면 된다.
      • 만약 버스가 꽉 차 있지 않을 경우 버스에 자리가 있으므로 버스 도착시간에만 오면 된다.
    • i for문 = 버스 도착 시간을 돈다.
    • j for문 = 버스에 최대 탈 수 있는 인원까지 돈다.
  • class Time implements Comparable<Time>{
    	int hour;
    	int mitune;
    	public Time(int hour,int mitune) {
        
    		if(mitune >= 60) {//분이 60보다 크면 시간을 더해주고 분을 60 빼준다
    			hour++;
    			mitune -= 60;
    		}else if(mitune < 0) {//분이 0보다 작으면 시간을 빼주고 분을 60 더해준다.
    			hour--;
    			mitune += 60;
    		}
    		this.hour = hour;
    		this.mitune = mitune;
    	}
    	@Override
    	public int compareTo(Time o) { // 우선순위부여 기준
    		if(o.hour == this.hour)//시간이 같다면
    			return this.mitune - o.mitune; // 분이 작은 순으로
    		return this.hour - o.hour;//시간이 작은 순으로
    	}
    }
    public static String answer;
    public static String solution(int n, int t, int m, String[] timetable) {
    	answer = "";//정답
        Queue<Time> pq = new PriorityQueue<>();
        for(int i=0;i<timetable.length;++i) {
        	int hour = Integer.parseInt(timetable[i].split(":")[0]);
            int mitune = Integer.parseInt(timetable[i].split(":")[1]);
            pq.offer(new Time(hour,mitune));//내가 시간이 작은 순으로 정렬된다.
       	}
        counting(n,t,m,pq);
        return answer;
    }
    private static void counting(int n, int t, int m, Queue<Time> pq) {
    	Time bus = new Time(9, 0);
        Time corn = new Time(9, 0);
        for(int i=0;i<n;++i) {//마지막 버스까지
        	int people = 0;
            for(int j=0;j<m;++j) {//해당 버스의 마지막 사람까지
            	if(!pq.isEmpty()) { 
                	Time now = pq.peek();
                    if(bus.compareTo(now) >= 0) { // 기다리는 사람이 해당 버스를 탈 수 있다면
                    	corn = pq.poll(); //해당 버스를 태운다. 
                        people++;		  //태운 사람 숫자 증가
                    }
                }
    			if(i == n-1 && people == m) { //마지막 버스의 태운 사람이 꽉찰경우
            		corn = new Time(corn.hour, corn.mitune-1); // 콘이 탈 자리가 없으므로 마지막으로 태운 사람의 도착시간을 -1분을 한다.
                }else if(i == n-1 && people < m) {//마지막 버스의 자리가 남을 경우
                	corn = new Time(bus.hour,bus.mitune); // 콘이 탈 자리가 있으므로 버스 도착 시간에 오면 된다.
    			}
    		}	
            bus = new Time(bus.hour, bus.mitune+t); // 다음 버스 시간 세팅
    	}
        StringBuilder sb = new StringBuilder();
        sb.append((corn.hour < 10) ? "0"+corn.hour : corn.hour); // 한자리 숫자면 앞에 0을 붙힌다
        sb.append(":");
        sb.append((corn.mitune < 10) ? "0"+corn.mitune : corn.mitune);//한자리 숫자면 앞에 0을 붙힌다
        answer = sb.toString();
    }
728x90

'알고리즘 > 프로그래머스' 카테고리의 다른 글

LEVEL 3 : 보석쇼핑  (0) 2021.12.08
LEVEL 3 : 표 편집  (0) 2021.12.08
LEVEL 3 : 자물쇠와 열쇠  (0) 2021.11.26
LEVEL 3 : 다단계 칫솔 판매  (0) 2021.11.26
LEVEL 3 : 순위  (0) 2021.11.26