-
프로그래머스 Lv2 [3차]파일명 정렬Computer Science/프로그래머스 2023. 9. 26. 10:17
https://school.programmers.co.kr/learn/courses/30/lessons/17686
이 문제는 파일이름을 파싱 받아서 정렬하는 문제이다.
파일 이름은 HEAD, NUMBER, TAIL로 나뉘어지는데
HEAD는 대,소문자 문자열, NUMBER는 00000 이나 0101이 가능한 숫자, TAIL은 나머지 부분이다.
간단하게 전체 코드는 파싱받은 후 정렬하는식으로 풀었다.
파싱을 위해 구조체를 선언했다.
struct FILE_INFO { string head; int number; int index = 0; };
정렬하는 코드는 HEAD가 같다면 NUMBER를 비교하고, NUMBER가 같다면 파일명 순서를 비교했다.
bool cmp(const FILE_INFO& lhs, const FILE_INFO& rhs) { if(lhs.head == rhs.head) { if(lhs.number == rhs.number) { return lhs.index < rhs.index; }else { return lhs.number < rhs.number; } }else { return lhs.head < rhs.head; } }
HEAD 비교를 위해 대문자를 모두 소문자로 변환했다. 이 과정을 안거치면 대문자가 앞에 왔다.
파싱을 하기 위해 files를 순회하고
그 안에서 문자열을 탐색하며 파싱했다.
HEAD를 파싱하는 중, 숫자가 나오면 NUMBER로, NUMBER를 파싱하는 중 문자가 나오면 지금까지 받은 값을
구조체에 저장했다.
외워야 할 함수로는 tolower, isdigit, stoi가 있었다.
tolower는 대문자를 소문자로 바꿔주는 함수
isdigit는 숫자인지, 문자인지 판단하는 함수
stoi는 문자열을 숫자로 바꿔주는 함수이다.
#include <string> #include <vector> #include <string> #include <algorithm> #include <iostream> using namespace std; struct FILE_INFO { string head; int number; int index = 0; }; vector<FILE_INFO> vec; //HEAD, TAIL, NUMBER 파싱 후 정렬한다. bool cmp(const FILE_INFO& lhs, const FILE_INFO& rhs) { if(lhs.head == rhs.head) { if(lhs.number == rhs.number) { return lhs.index < rhs.index; }else { return lhs.number < rhs.number; } }else { return lhs.head < rhs.head; } } bool isdigit(char ch) { if(ch < '0' || ch > '9') return false; return true; } vector<string> solution(vector<string> files) { vector<string> answer; for(int i = 0; i < files.size(); ++i) { string str = ""; for(int j = 0; j < files[i].size(); ++j) str += tolower(files[i][j]); string HEAD = ""; string number = ""; int pointer = 0; while(pointer < str.length()) { if(isdigit(str[pointer])) break; HEAD += str[pointer]; ++pointer; } while(pointer < str.length()) { if(!isdigit(str[pointer])) break; number += str[pointer]; ++pointer; } FILE_INFO f; f.head = HEAD; f.index = i; f.number = stoi(number); vec.push_back(f); } sort(vec.begin(), vec.end(), cmp); for(int i = 0; i < vec.size(); ++i) { answer.push_back(files[vec[i].index]); } return answer; }
'Computer Science > 프로그래머스' 카테고리의 다른 글
프로그래머스 Lv2 [1차]캐시 (0) 2023.09.28 프로그래머스 Lv2 [3차]압축 (0) 2023.09.26 프로그래머스 Lv2 [3차]n진수 게임 (0) 2023.09.26 프로그래머스 Lv2 의상 (0) 2023.09.24 프로그래머스 Lv2 다리를 지나는 트럭 (0) 2023.09.24