728x90
1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/150370
2. 문제 풀이
today, terms, privacies 를 받아서 오늘 처리해야 할 개인정보 번호를 오름차순으로 answer에 저장해야 한다. 숫자 요소가 전부 string으로 들어오기 때문에 약간 까다롭다. 그리고 날짜를 어떻게 구분해야 할지 고민했는데, 전체 날짜를 '일'로 환산해서 오늘 날짜와 비교해서 기간이 지났는지 구분했다.
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
vector<int> answer;
vector<string> year, month, day;
// today 분리
int todayYear, todayMonth, todayDay;
sscanf(today.c_str(), "%d.%d.%d", &todayYear, &todayMonth, &todayDay);
// 띄어쓰기로 분리
unordered_map<char, int> termDuration;
for (const string& term : terms) {
char type;
int duration;
stringstream ss(term);
ss >> type >> duration;
termDuration[type] = duration * 28;
}
// privacies 분리
for (int i = 0; i < privacies.size(); i++) {
string date, type;
stringstream ss(privacies[i]);
ss >> date >> type;
int year, month, day;
sscanf(date.c_str(), "%d.%d.%d", &year, &month, &day);
int totalDays = year * 12 * 28 + month * 28 + day + termDuration[type[0]];
int todayTotalDays = todayYear * 12 * 28 + todayMonth * 28 + todayDay;
if (totalDays <= todayTotalDays) {
answer.push_back(i + 1);
}
}
return answer;
}
3. 참고
문자열 처리
특정 문자를 기준으로 분리
sscanf는 scanf와 유사하지만 기능 차이가 있다. scanf와 달리, 입력 대상이 표준 입력이 아닌 매개변수로 전달하는 문자열 버퍼라는 차이가 있다.
int sscanf(const char *buffer, const char *format, argument-list);
sscanf는 buffer에 있는 값을 받아 각각의 변수에 저장하는 방식이다. 예를 들어서, 아래와 같이 today라는 string 배열을 지정된 형식에 맞추어 매개변수에 저장하도록 하는 것이다.
int todayYear, todayMonth, todayDay;
sscanf(today.c_str(), "%d.%d.%d", &todayYear, &todayMonth, &todayDay);
띄어쓰기를 기준으로 분리
stringstream ss(문자열)을 사용해서 객체 ss에 분리할 문자열을 집어 넣는다. 띄어쓰기 단위로 구분해서 각각의 변수에 저장할 수 있다.
stringstream ss(term);
ss >> type >> duration;
unordered_map
C++ STL 중 하나로, map보다 더 빠른 탐색을 하기 위한 자료구조다. unordered_map은 해쉬테이블로 구현한 자료구조로 탐색 시간복잡도는 O(1)으로 map의 시간복잡도 O(logn)보다 훨씬 빠르다.
728x90
'PS > Programmers' 카테고리의 다른 글
[C++] 프로그래머스 : 숫자의 표현 (0) | 2024.03.08 |
---|---|
[C++] 프로그래머스 : 네트워크(DFS) (0) | 2024.02.25 |