카카오 신입 공채 3차 코딩 테스트 풀이 - 3번문제

2018-06-05 01:12:03 | 조회수 2661



3번 문제로 넘어가보겠습니다. 3번 문제 역시 큰 틀에서는 구현문제입니다. 얼핏 보면 까다로운 것 같지만 이 문제는 1,2 번에 비해 굉장히 쉬운문제입니다. 파일명이 주어지고 이를 정렬하는데, 우선 반드시 head,number,[tail]의 순서로 파일명이 되어 있음이 보장됩니다. 또 숫자가 5글자 이내이기 때문에 long long 으로 처리할 수 없는 큰 숫자가 나오는 경우도 없습니다.


때문에 while 문을 통해 간단하게 head, number, [tail]을 저장할 수 있으며, 이를 기준으로 sort를 하면 됩니다. 단, 결과가 같은 경우 이전의 파일 순서를 유지해야 한다고 했으므로, 간단히 파일이 들어온 순서대로 번호를 매겨 결과가 같은 경우 숫자가 더 작은 쪽을 앞으로 두면 됩니다. 1번부터 3번까지 별도의 알고리즘 능력을 평가하기 보다는 구현을 얼마나 정확히 할 수 있는가를 평가하는 것 같았습니다.


class Node{public:    int no;    string ohead, onumber, otail;    string head, number, tail;    bool operator <(const Node &n) const    {        if (head != n.head) return head < n.head;        if (number != n.number) return stoi(number) < stoi(n.number);        return no < n.no;    }};vector<string> solve(vector<string> files){    vector<Node> v(files.size());    vector<string> ans;    int idx = 0;    for (string file : files)    {        int i = 0;        v[i].no = idx;        while (!('0' <= file[i] && file[i] <= '9')) v[idx].head += file[i++];        while (('0' <= file[i] && file[i] <= '9')) v[idx].number += file[i++];        while (i < file.length()) v[idx].tail += file[i++];        idx++;    }    for (int i=0; i<v.size(); i++)    {        auto &it = v[i];        it.ohead = it.head, it.otail = it.tail;        transform(it.head.begin(), it.head.end(), it.head.begin(), ::toupper);        transform(it.tail.begin(), it.tail.end(), it.tail.begin(), ::toupper);    }    sort(v.begin(), v.end());    for (auto it : v)        ans.push_back(it.ohead + it.number + it.otail);    return ans;}


카카오 신입 공채 3차 코딩 테스트 풀이 - 3번문제 - 알고리즘닷컴
32 개의 글