PS/Softeer

[21년 재직자 대회 예선] 회의실 예약 - lv2

ForteQook 2022. 10. 4. 21:52

문제

Softeer

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

풀이

정말 오랜만에 c++로 풀이하느라 애를 많이 먹었다.

문제 자체는 정말 쉬운데, 회의실 이름을 키 값으로 하고 스케쥴 상 비어있는 시간을 pair로 가지고 있는 vector를 값으로 map을 만들어준뒤, 예약 시간이 입력될 때마다 해당 회의실의 가능한 시간을 갱신해나가면 된다. 새로 vector를 만들어서 pair를 넣어줘서 map의 value가 새로 생성된 pair를 가리키게 하면 되겠다. 다만 c++은 사용하지 않는 vector는 메모리 해제를 직접 해줘야 하는데, 파이썬의 편리함에 물들어 까먹고 그냥 제출해버렸다... 어쨌거나 맞았으니 다행.

다음은 문제를 풀며 참고한 c++ 문법 레퍼런스이다.

1. c++ 도 문자열끼리 연산을 허용하더라!

[C++] string (문자열) 클래스 정리 및 사용법과 응용 (rebro.kr)

 

[C++] string (문자열) 클래스 정리 및 사용법과 응용

[목차] 1. string 클래스란? 2. string 클래스의 입출력 3. string 클래스 생성 4. string 클래스 연산자 활용 5. string 클래스의 멤버 함수 6. string 클래스의 멤버 함수 사용 예시 1. string 클래스란? - C++..

rebro.kr

2. vector, string 등이 비어있을 때 확인은 empty 메서드로 한다!

C++에서 벡터가 비어 있는지 확인 (techiedelight.com)

 

C++에서 벡터가 비어 있는지 확인

이 게시물에서는 C++에서 Vector가 비어 있는지 확인하는 방법에 대해 설명합니다. 즉, 크기가 0인지 확인하십시오. 1. 사용 std::vector::empty C++에서 Vector가 비어 있는지 확인하는 표준 솔루션은 std::ve

www.techiedelight.com

3. c++ 에서 논리연산자는 !, &&, || 이다!

twogenesis's Data warehouse :: [C++] 논리연산자 - AND, OR, NOT (tistory.com)

 

[C++] 논리연산자 - AND, OR, NOT

이번 포스팅에서는 논리연산자에 대해서 알아봅니다. 논리연산자는 연산의 결과로 true 혹은 false를 출력해 주는 연산자입니다. && (AND 연산자), | | (OR 연산자), ! (NOT연산자) 3가지가 있습니다. 제

twogenesis.tistory.com

4. 직접 사용하진 않았지만, c++은 스프레드 연산자가 없기 때문에 vector를 복사하는 법을 알아둘 필요가 있겠다!

C++에서 벡터 복사 (techiedelight.com)

 

C++에서 벡터 복사

이 게시물은 C++에서 Vector를 복사하는 방법에 대해 설명합니다. Vector 복사에는 원본 Vector에 있는 각 요소의 복사본을 동일한 순서로 사용하여 새 Vector를 구성하는 작업이 포함됩니다. 1. 복사 생

www.techiedelight.com

5. vector<pair<int,int>>를 어떻게 초기화하고 값을 넣어줬는지 코드를 통해 다시 확인하자. 아래는 참고 링크.

c++11 - Store pair values in vector C++ from a 2d vector - Stack Overflow

 

Store pair values in vector C++ from a 2d vector

I've been given a 2D vector (A). I need to store values of row and column index of that vector which contains element 0. Here is my code- vector<pair<int,int>>v; for(int i=0;i<A.s...

stackoverflow.com

깨작코딩 (tistory.com)

 

[C++] Pair 개념, 활용, 선언, 초기화, 대소 비교

0. Pair 개념 Pair은 데이터 타입이 다를 수 있는 두 개의 값을 함께 결합될 때 사용된다. Pair 컨테이너는 'utility' 헤더에 선언되어 있으며, 두 개의 데이터 원소나 객체로 선언되어 있다. pair (data_type

siloam72761.tistory.com

[C++/STL]pair, vector (tistory.com)

 

[C++/STL]pair, vector

가장 기본적인 STL 컨테이너라고 할 수 있는 pair와 vector에 대해서 먼저 알아보도록 하겠습니다. 이해하기 쉽도록 제 나름대로 정한 정의와 문제를 풀 때의 쓰임새를 알아보고 난 후, 멤버 함수들

sarah950716.tistory.com

C++ vector사용법 및 설명 (장&단점) (tistory.com)

 

C++ vector사용법 및 설명 (장&단점)

C++의 vector는 C++ 표준라이브러리(Standard Template Library)에 있는 컨테이너로 사용자가 사용하기 편하게 정의된 class를 말합니다. vector를 생성하면 메모리 heap에 생성되며 동적할당됩니다. 물론 속

hwan-shell.tistory.com

6. vector를 순회할 때 파이썬처럼 범위기반으로 접근할 수 있다!

[C++][Vector] 범위 기반 반복문 (tistory.com)

 

[C++][Vector] 범위 기반 반복문

인트로 안녕하세요. 오늘은 범위기반 for문에 대해서 알아보겠습니다. 범위기반 for문은 C++11에서 적용되었다고 합니다. (ISO가 승인한 2011년 8월 12일에 승인한 C++ 프로그래밍 언어의 최신판) 기존

life-with-coding.tistory.com

7. map을 순회할 때도 파이썬에서의 unpack, JS에서의 비구조화 할당처럼 할 수 있다!

C++에서 맵을 반복하는 방법 | Delft Stack

 

C++에서 맵을 반복하는 방법

이 기사에서는 STL 맵 데이터 구조의 요소를 반복하는 방법을 보여줍니다.

www.delftstack.com

 

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;
}