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

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



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 개의 글