문제
풀이
정말 오랜만에 c++로 풀이하느라 애를 많이 먹었다.
문제 자체는 정말 쉬운데, 회의실 이름을 키 값으로 하고 스케쥴 상 비어있는 시간을 pair로 가지고 있는 vector를 값으로 map을 만들어준뒤, 예약 시간이 입력될 때마다 해당 회의실의 가능한 시간을 갱신해나가면 된다. 새로 vector를 만들어서 pair를 넣어줘서 map의 value가 새로 생성된 pair를 가리키게 하면 되겠다. 다만 c++은 사용하지 않는 vector는 메모리 해제를 직접 해줘야 하는데, 파이썬의 편리함에 물들어 까먹고 그냥 제출해버렸다... 어쨌거나 맞았으니 다행.
다음은 문제를 풀며 참고한 c++ 문법 레퍼런스이다.
1. c++ 도 문자열끼리 연산을 허용하더라!
[C++] string (문자열) 클래스 정리 및 사용법과 응용 (rebro.kr)
2. vector, string 등이 비어있을 때 확인은 empty 메서드로 한다!
C++에서 벡터가 비어 있는지 확인 (techiedelight.com)
3. c++ 에서 논리연산자는 !, &&, || 이다!
twogenesis's Data warehouse :: [C++] 논리연산자 - AND, OR, NOT (tistory.com)
4. 직접 사용하진 않았지만, c++은 스프레드 연산자가 없기 때문에 vector를 복사하는 법을 알아둘 필요가 있겠다!
C++에서 벡터 복사 (techiedelight.com)
5. vector<pair<int,int>>를 어떻게 초기화하고 값을 넣어줬는지 코드를 통해 다시 확인하자. 아래는 참고 링크.
c++11 - Store pair values in vector C++ from a 2d vector - Stack Overflow
[C++/STL]pair, vector (tistory.com)
C++ vector사용법 및 설명 (장&단점) (tistory.com)
6. vector를 순회할 때 파이썬처럼 범위기반으로 접근할 수 있다!
[C++][Vector] 범위 기반 반복문 (tistory.com)
7. map을 순회할 때도 파이썬에서의 unpack, JS에서의 비구조화 할당처럼 할 수 있다!
C++에서 맵을 반복하는 방법 | Delft Stack
C++... 오랜만에 하려니 엄청 불편하다...
#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
int main(int argc, char** argv)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N,M;
cin >> N >> M;
map<string,vector<pair<int,int>>> mapset;
for (int i = 0; i < N; i++) {
string str;
cin >> str;
mapset.insert(pair<string,vector<pair<int,int> > >(str, vector<pair<int,int> >()));
mapset[str].push_back(make_pair(9,18));
}
for (int i = 0; i < M; i++) {
string r;
cin >> r;
int s,t;
cin >> s >> t;
vector<pair<int,int>> new_time;
for (const auto& [_s,_t] : mapset[r]) {
// 만약 예약 가능한 시간이 있다면
if (s >= _s && t <= _t) {
if (_s < s) {
new_time.push_back(make_pair(_s,s));
}
if (t < _t) {
new_time.push_back(make_pair(t,_t));
}
}
else {
new_time.push_back(make_pair(_s,_t));
}
}
mapset[r] = new_time;
}
int cnt = mapset.size();
for (const auto& [key,value] : mapset) {
cout << "Room " << key << ":\n";
if (!value.empty()) {
cout << value.size() << " available:" << '\n';
}
else {
cout << "Not" << " available" << '\n';
}
for (const auto& [_s,_t] : value) {
string ns = to_string(_s);
if (_s < 10) {
ns = "0" + ns;
}
cout << ns << '-' << to_string(_t) << '\n';
}
cnt--;
if (cnt > 0) {
cout << "-----" << '\n';
}
}
return 0;
}
'PS > Softeer' 카테고리의 다른 글
[인증평가(4차) 기출] 통근버스 출발 순서 검증하기 - lv3 (0) | 2022.10.19 |
---|---|
[인증평가(3차) 기출] 교차로 - lv3 (0) | 2022.10.02 |