[문제풀이] 셔틀버스

업데이트:

2018 Kakao Blind Recruitment 기출 문제

문제 링크 : 셔틀버스

풀이 시간 : 40분

1. 문제 풀이

1) 먼저 계산 및 비교를 위해서 hh:mm 표현을 분 단위로 바꾼다.(버스 시간 및 사람 도착 시간)

2) 사람들의 도착 시간으로 정렬(오름차순)

3) 각 사람들이 탈 수 있는 버스를 찾아준다.

4) 가장 늦게 나가고 싶어하므로 가장 늦게 오는 버스에 탈 수 있는지 확인한다.

5-1) 마지막 버스에 탈 수 있는 경우, 그 버스의 시간을 출력

5-2) 못 타는 경우, 그 버스에 가장 늦게 타는 사람의 시간에서 1초를 뺀 시간을 출력

2. 소스 코드

	static public String solution(int n, int t, int m, String[] timetable) {
		String answer = "";
		Bus[] bus = new Bus[n];
		int[] arr = new int[timetable.length];
		// 09:00를 정수로 표현
		int time = 540;
		bus[0] = new Bus(time);
		// 버스 운행 시간
		for (int i = 1; i < n; i++) {
			time += t;
			bus[i] = new Bus(time);
		}
		// 사람들이 정류장에 오는 시간을 정수로 표현
		for (int i = 0; i < timetable.length; i++) {
			arr[i] = Integer.parseInt(timetable[i].substring(0, 2)) * 60
					+ Integer.parseInt(timetable[i].substring(3, 5));
		}
		// 먼저 오는 사람 순으로 정렬
		Arrays.sort(arr);
		int pivot = 0;
		// 각 사람이 탈 수 있는 버스에 타는 사람 수를 늘려준다.
		for (int i = 0; i < arr.length && pivot<n; i++) {
			// 현재 사람이 탈 수 있는 버스 찾기
			if (bus[pivot].t >= arr[i]) {
				bus[pivot].m++;
				// 시간이 같은 사람이 오면 번호가 낮은 사람으로 기준
				if(bus[pivot].last==-1 || arr[i] > arr[bus[pivot].last]) {
					bus[pivot].last = i;
				}
				// 버스에 사람이 꽉 찰 경우
				if (bus[pivot].m == m) {
					pivot++;
				}
			}else {
				i--;
				pivot++;
			}
		}
		int temp = 0;
		// 맨 마지막 버스에 사람이 탈 수 있는 찾기
		if (bus[n - 1].m != m) {
			// 탈 수 있으면 그 버스가 오는 시간
			temp = bus[n - 1].t;

		} else {
			// 못 타면 마지막 사람의 시간에서 1초 빠른 시간
			temp = arr[bus[n - 1].last] - 1;
		}
		// 정수형 시간을 hh:mm으로 변환
		int hour = temp / 60;
		int minute = temp % 60;
		if (hour < 10) {
			answer = "0";
		}
		answer += hour + ":";
		if (minute < 10) {
			answer += "0";
		}
		answer += minute;
		return answer;
	}

	static class Bus {
		// 시간, 탄 사람 수, 마지막에 타는 사람 번호
		int t;
		int m;
		int last;

		Bus(int t) {
			this.t = t;
			this.m = 0;
			this.last = -1;
		}
	}	

3. 후기

버스와 사람의 인덱스를 동시에 건들이기 때문에

중간에 인덱스에 대한 오류가 생겨 해결에 시간을 소비했다.