본문 바로가기

알고리즘

[2018 KAKAO BLIND RECRUITMENT] 셔틀버스(C++)

https://programmers.co.kr/learn/courses/30/lessons/17678?language=cpp#

 

코딩테스트 연습 - [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

 

이 문제는 간단했지만, 어이없는 변수 명령 코드 하나로 정답률 79퍼에 머무르게 되어서 기록을 한다.

 


 

 

우선 문제는 다음과 방식으로 코드를 작성해서 해결해야 한다.

 

 

 

주어진 vector<string> timetable을 정렬하지 않고 사용하면, 도착 시각을 일일이 체크하면서, 어떤 시간대에 버스를 타야하는지 매번 결정해야 하고, 변경이 필요하다.

 

 

 

어짜피 정렬되어지기 때문에, 미리 정렬을 해도 상관없다고 판단했다.

 

 

 

그 이후에는, 오름차순으로 정렬된 timetable을 운행 횟수만큼의 크기의 vector 자료 구조에 넣었다.

 

 

 

정답을 구하기 위해서는, 가장 마지막 버스 시간표가 사람이 꽉차지 않았다면 버스가 오면서 동시에 타도 된다. 하지만 사람이 꽉찼다면, 탄 사람보다 1분먼저 도착하면 될 것이다.

 

 

 


 

 

내가 이 부분에서 실수한 것은, 

 

 

    // Take a Bus

    int bus_idx = 1;

    for (int i = 0; i < v.size() && i >= 0; i++) {

        if ((9 * 60) + (bus_idx - 1) * t >= v.at(i)) {

            bus[bus_idx].push_back(v.at(i));

            if (bus[bus_idx].size() == m) {

                i--; // 이 부분이 실수

                bus_idx++;

                if (bus_idx > n)

                    break;

            }

        }

        else {

            bus_idx++;

            i--;

            if (bus_idx > n)

                break;

        }

    }

 

 

버스의 시간대가 아닌 사람을 재 검사하기 위해서, else문에 넣었던 i--을 위에 관계없는 부분에 작성했던 것이다. 1시간동안 시간이 소요됐었다. 

 

 

 

이런 실수를 줄이기 위해서는, ++, -- 연산에 주의를 하는 습관을 들여야겠다.

 

 

 


 

 

해설코드(C++).

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
 
using namespace std;
 
int timetoI(string str) {
    int result = 0;
    result += 600 * (str[0- '0');
    result += 60 * (str[1- '0');
    result += 10 * (str[3- '0');
    result += 1 * (str[4- '0');
 
    return result;
}
 
string strtoTime(int time) {
    string str = "";
    if (time / 60 < 10) {
        str.append("0");
    }
    str.append(":");
    if (time % 60 < 10
        str.append("0");
 
    return str;
}
 
bool myfunc(int i, int j) { return i < j; }
 
string solution(int n, int t, int m, vector<string> timetable) {
    string answer = "";
    int result;
    vector<int> bus[11];
    vector<int> v;
 
    // Sort
    for (int i = 0; i < timetable.size(); i++) {
        v.push_back(timetoI(timetable[i]));
    }
    sort(v.begin(), v.end(), myfunc);
 
    // Take a Bus
    int bus_idx = 1;
    for (int i = 0; i < v.size() && i >= 0; i++) {
        if ((9 * 60+ (bus_idx - 1* t >= v.at(i)) {
            bus[bus_idx].push_back(v.at(i));
            if (bus[bus_idx].size() == m) {
                bus_idx++;
                if (bus_idx > n)
                    break;
            }
        }
        else {
            bus_idx++;
            i--;
            if (bus_idx > n)
                break;
        }
    }
 
    // Check 
    if (bus[n].size() == m) {
        result = bus[n][bus[n].size() - 1- 1;
    }
    else {
        result = (9 * 60+ (n - 1* t;
    }
 
    answer = strtoTime(result);
    return answer;
}
 
 

 

 


 

 

며칠뒤면, 이직을 위한 코딩테스트가 있을 예정이다.

 

하지만! 불행하게도...

 

회사 근무와 겹치면서, 회사에서 시험을 봐야할 것 같다. 환경 신경쓰지말고 어찌됐든 최선을 다할 수 있기를...