티스토리 뷰

728x90

programmers.co.kr/learn/courses/30/lessons/17686

 

코딩테스트 연습 - [3차] 파일명 정렬

파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램

programmers.co.kr

- 접근법

문제에서 요구하는 사항 그대로하면 되는 구현문제,

 

 String형태로 파일명이 주어지고 

파일명은 HEAD+NUMBER+TAIL로 구성된다.

HEAD : 파일명에서 숫자가 처음 등장할때까지의 문자

NUMBER : 숫자 (최대 5번 연속가능, 그 뒤에 나오는 숫자는 고려X)

TAIL : HEAD+NUMBER 제외한 나머지 모든 문자

 

이렇게 가공된 데이터를 가지고 정렬을 한다.

정렬 기준은

1. HEAD 사전순 (대소문자 구별X)

2. NUMBER 오름차순

3. 파일이 빨리 들어온 순서 (원래 주어진 입력의 순서)

 

내가 구현한 방식은 파일명을 받아 벡터에 구조체를 넣어 (원래 파일명, HEAD , NUMBER ,TAIL , 입력된 순서) 로 저장했고

이것을 기반으로 정렬했다.

 


- 소스코드

 

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
76
77
78
79
80
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
 
struct Info {
    string name;
    string head;
    string tail;
    int number;
    int ordered;
};
vector<Info> db_files;
string to_lower(string A) {
    for(int i=0;i<A.length();i++) {
        A[i]=tolower(A[i]);
    }
    return A;
}
Info get_Info(string A,int nums) {
    Info file_info;
    string temp="";
    int idx;
    file_info.name=A; // 원본 파일명
    A=to_lower(A);
    for(int i=0;i<A.length();i++) {
        if(A[i]>='0' && A[i]<='9') {
            file_info.head=temp; // HEAD
            temp="";
            idx=i;
            break;
        }
        temp+=A[i];
    }
    bool flag=true;
    for(int i=idx;i<idx+5;i++) {
        if(!(A[i]>='0' && A[i]<='9')) {
            flag=false;
            file_info.number=stoi(temp); // NUMBER
            temp="";
            idx=i;
            break;
        }
        temp+=A[i];
    }
    if(flag) {
        file_info.number=stoi(temp);
        temp="";
        idx=A.length();
    }
    for(int i=idx;i<A.length();i++) {
        temp+=A[i];
    }
    file_info.tail=temp; // TAIL
    file_info.ordered=nums; // 들어온 순서
    return file_info;
}
bool comp(const Info &A, const Info &B) {
    if(A.head.compare(B.head)==0) {
        if(A.number==B.number) {
            return A.ordered<B.ordered;
        }
        return A.number<B.number;
    }
    return A.head<B.head;
}
vector<string> solution(vector<string> files) {
    vector<string> answer;
    Info temp_file; 
    for(int i=0;i<files.size();i++) {
        temp_file=get_Info(files[i],i+1);
        db_files.push_back(temp_file);
    }
    sort(db_files.begin(),db_files.end(),comp);
    for(int i=0;i<db_files.size();i++) {
        answer.push_back(db_files[i].name);
    }
    return answer;
}
cs
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함