삐까냥의 파도타기

카카오 블라인드 채용 신입 공채 1차 코딩 테스트) 4번 문제 본문

코딩/카카오 코딩 테스트

카카오 블라인드 채용 신입 공채 1차 코딩 테스트) 4번 문제

금손형아 2017. 9. 30. 19:52




문제 출처 : http://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/


지난 9월 16일(토) 오후 2시부터 오후 7시까지 5시간동안 진행한 코딩테스트입니다.


보통 코딩 테스트 문제 유출하면 안되는데, 카카오는 문제를 공개하고 직접 문제 해설도 진행했습니다.


시험 당시 제출했던 코드와 해설을 참고하여 수정한 코드를 올리겠습니다.


이것 또한 공부가 되겠죠.





함정은 2번 문제에 있었습니다.


인원수 계산으로 코드를 짠다면 함정에 빠지는 문제네요.


저는 이 문제 틀렸습니다.


변명을 하자면 문제 리딩 후 함정을 파악했는데,


코드를 짜면서 함정을 까먹었습니다.


시험 종료 5분전에 함정을 다시 파악했지만


코드 수정에는 부족한 시간이었습니다.





public class kakao4 {


public static void main(String[] args) {

solution(1, 1, 5, new String[]{"08:00", "08:01", "08:02", "08:03"});

solution(2, 10, 2, new String[]{"09:10", "09:09", "08:00"});

solution(2, 1, 2, new String[]{"09:00", "09:00", "09:00", "09:00"});

solution(1, 1, 5, new String[]{"00:01", "00:01", "00:01", "00:01", "00:01"});

solution(1, 1, 1, new String[]{"23:59"});

solution(10, 60, 45, new String[]{"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"});

}

static String solution(int n, int t, int m, String[] timetable) {

ArrayList<Integer> peopleArray = new ArrayList<Integer>();

for (int i=0; i<timetable.length; i++) { //timetable 등록

int getMinute = getMinuteTime(timetable[i]); //시간 String을 minute으로 바꿔서 저장

if ( getMinute < 9*60 + ((n-1)*t)+1) { //버스 마지막 시간까지 줄선 사람만 등록(이후에는 버스도 탈 수 없으며 밤 12시에는 모두 집에 간다)

peopleArray.add(getMinute);

}

}

Collections.sort(peopleArray); //minute에 따른 정렬

for (int num = 0; num<n-1; num++) { //(셔틀 운행 횟수 - 1)번 만큼 수행하여 사람들을 태운다.

int busStartTime = 9*60 + (num*t); //버스 출발 시간

for (int boardPeople=0; boardPeople<m-1; boardPeople++) { //최대 인원수 까지만 태운다

if (peopleArray.size() == 0 || busStartTime < peopleArray.get(0)) { //태울 사람이 없거나 busStartTime 이후에 도착한 사람이면 종료

break;

}

peopleArray.remove(0);

}

}

int lastBusStartTime = 9*60 + ((n-1)*t), resultTime; //버스 마지막 출발 시간

if (peopleArray.size() == 0 || peopleArray.size() <= m-1) {//탈 사람이 아예 없거나 내가 탈 자리가 남아있다면

resultTime = lastBusStartTime;     //버스 출발시간에 도착

} else { //내가 탈 자리가 부족하면 

resultTime = peopleArray.get(m-1)-1; //버스를 마지막에 타는 사람보다 1분 일찍 도착

}

String resultTimeString = getTimeString(resultTime);

System.out.println(resultTimeString);

        return resultTimeString;

    }

static int getMinuteTime(String getTime) { //시간 String을 minute로 변환

String[] time = getTime.split(":");

int calTime = (Integer.valueOf(time[0])*60) + Integer.valueOf(time[1]);

return calTime;

}

static String getTimeString(int time) { //minute를 시간 String으로 변환

StringBuffer timeString = new StringBuffer();

int hour = time/60;

int minute = time%60;

if (hour>10) {

timeString.append(hour+":");

}else {

timeString.append("0"+hour+":");

}

if (minute<10) {

timeString.append("0" + minute);

}else {

timeString.append(minute);

}

return String.valueOf(timeString);

}

}





타임 테이블에 등록된 사람들을 모두 등록 후


버스가 태운 사람들을 타임 테이블에서 제거했습니다.


결국 마지막 버스를 탈 사람들만 남게 되는데


이 사람들 속에서 계산하면 됩니다.






- 추가 코드 (17년 10월 25일) -


import java.util.Collections;

import java.util.LinkedList;


public class Q4 {


public static void main(String[] args) {

solution(1, 1, 5, new String[]{"08:00", "08:01", "08:02", "08:03"});

solution(2, 10, 2, new String[]{"09:10", "09:09", "08:00"});

solution(2, 1, 2, new String[]{"09:00", "09:00", "09:00", "09:00"});

solution(1, 1, 5, new String[]{"00:01", "00:01", "00:01", "00:01", "00:01"});

solution(1, 1, 1, new String[]{"23:59"});

solution(10, 60, 45, new String[]{"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"});

}

static void solution(int n, int t, int m, String[] timetable) {

int startTime = 540 - t, remainSeat = 0, lastTime = 0;

LinkedList<Integer> crews = getCrews(timetable);

for ( int i = 0; i < n; i++ ) {

startTime += t;

for ( int j = 0; j < m; j++ ) {

if ( crews.size() > 0 && crews.getFirst() <= startTime ) {

if ( i == n-1 ) { //마지막 셔틀 버스에서만 계산하면 되기 때문에

lastTime = crews.getFirst();

}

crews.removeFirst();

} else {

if ( i == n-1 ) { //마지막 셔틀 버스에서만 계산하면 되기 때문에

remainSeat = m - j;

}

break;

}

}

}

if ( remainSeat == 0 ) { //자리가 없으면 마지막 사람보다 1분 일찍 도착 아니라면 버스시간에 도착

startTime = lastTime - 1;

}

System.out.println(getTime(startTime/60) + ":" + getTime(startTime%60));

}

static LinkedList<Integer> getCrews(String[] timetable) {

LinkedList<Integer> crews = new LinkedList<Integer>(); 

for ( int i = 0; i < timetable.length; i++ ) {

crews.add(getTime(timetable[i]));

}

Collections.sort(crews);

return crews;

}

static int getTime(String time) {

String[] times = time.split(":");

return Integer.valueOf(times[0])*60 + Integer.valueOf(times[1]);

}

static String getTime(int time) {

if ( time < 10 ) {

return "0" + String.valueOf(time);

}

return String.valueOf(time);

}

}


이전 코드는 버스를 타는 사람의 수를 계산하여 구현했지만


이번에는 버스에 한사람 한사람이 타는 알고리즘으로 코드를 구현했습니다.


시간에 맞게 사람을 태우다 보니


23:59분에 줄을 서는 사람을 생각할 필요가 없어졌죠.







좀 더 좋은 코드 및 다듬을 부분을 알려주시면 감사히 학습하겠습니다.