프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 입력
- 1000개 이하의 파일명이 있는 files
- 출력
- 규칙에 따라 파일명이 올바르게 정렬된 배열
- 규칙
- head: 알파벳 순 (대소문자 구분 x)
- number: 9 < 10 < 0011 < 012 < 13 < 014 순, 012와 12는 정렬 시에 같은 값
- tail: files 배열에서 먼저 나오는 순서로 정렬
- 풀이 방법
- head, number, tail 찾기 -> 문자열에서 숫자가 나오는 인덱스 체크
- 구조체를 사용해 파일명을 head, number, idx로 나누어 저장
- head, number, 원래 파일 순서로 정렬 (tail은 정렬에 사용되지 x)
풀이
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct filename {
int idx;
string head;
int number;
};
vector<filename> v;
bool compare(const filename& a, const filename& b){
if (a.head == b.head){
if (a.number == b.number){
return a.idx < b.idx;
} else return a.number < b.number;
} else return a.head < b.head;
}
vector<string> solution(vector<string> files) {
vector<string> answer;
for (int i=0;i<files.size();i++){
vector<int> index;
for (int j=0;j<files[i].size();j++){
if ('0'<=files[i][j] && files[i][j]<='9'){
index.push_back(j);
}
}
string head = "";
for (int j=0;j<index[0];j++){
head += tolower(files[i][j]);
}
string number = files[i].substr(index[0], index.size());
filename f;
f.idx = i;
f.head = head;
f.number = stoi(number);
v.push_back(f);
}
sort(v.begin(), v.end(), compare);
for (int i=0;i<v.size();i++){
answer.push_back(files[v[i].idx]);
}
return answer;
}
이 문제에서 가장 먼저 떠올려야 하는 것은 head, number, tail을 어떻게 나눠서 저장할 것이냐이다. 내 방법은 구조체 사용하기 였고, compare 함수를 사용해 규칙대로 정렬을 수행했다. 또한 문자열 관련 함수를 적절히 사용할 수 있는 것도 중요하다. substr의 쓰임이라던지, tolower 함수를 사용해 대소문자의 구분을 없애주는 것이 문제의 핵심이라 할 수 있다.
'Algorithm' 카테고리의 다른 글
[프로그래머스 level3] 파괴되지 않은 건물 C++ (4) | 2024.10.08 |
---|---|
[프로그래머스 level3] 이중우선순위큐 C++ (1) | 2024.10.08 |
[백준 BOJ] 2473 세 용액 C++ (1) | 2024.10.03 |
백트래킹 (0) | 2024.10.01 |
[프로그래머스 level1] 개인정보 수집 유효기간 C++ (0) | 2024.10.01 |