본문 바로가기

PS/BaekJoon

[C++/14402] 야근


 단순히 기록용 입니다... 어떻게 풀었는가 생각도 다시 해보고 그러니까 아마도 도움은 안되실 것 같습니다.


야근 듣기만해도 오늘 내가 일을 못했구나 하는 느낌입니다. 야근하지 않기 위해서는 일에 몰입해야겠죠. 또는 일이 너무 많아서 야근을 하게 된다면 일단 최선을 다해야된다고 생각합니다. 왜냐면 어쨌든 저는 조직 소속이니까요.

이 문제는 야근을 한 인원이 몇명인지 파악하는 문제입니다. 조건은 아래와 같습니다.

 " 만약, 들어간 기록은 없는데, 나온 기록이 있다면 회사에서 야근을 한 것으로 기록된다. 또한 회사에 들어갔는데, 퇴근시간까지 나오지 않는다면, 이 또한 야근을 하는 것으로 기록된다. 출입기록에 따라서 두 기준 다 만족할 수도 있는데, 이는 야근을 두 번 한 것으로 인정된다. "

들어간 기록은 없는데, 나온 기록이 있다면? 언제 들어갔는지 파악할 수 없기 때문에 야근으로 칩니다. 그리고 퇴근시간까지 나오지 않았다면? 즉 나온 흔적이 없다면? 야근이라는 말입니다. 그리고 출입기록에 따라서 두 기준을 다 만족할 수 있는데 이 조건은 중복해서 체크하지 말라는 말인것 같습니다. 순차적으로 입력값을 파악하면 되는 문제입니다.

일단 들어가는건 무조건 체크를 해주고 빠져나오는것도 무조건 체크를 해주면서 1 또는 0을 유지하는 겁니다. 만약에 계속해서 출근만 찍힌다면? 그것은 빠져나오지 못하고 야근을 한 것이기 때문에 계속해서 +를 해주면 됩니다.

- 도 마찬가지로 일단 -가 걸리면 무조건 하나를 빼주는데, 만약 출근한적이 없는 0인 상태라면? -1을 적용하지 않고 야근을 했다는 의미로 다른 map에 저장을 해줍니다.

왜냐하면 -가 계속 이루어지다가 +가 계속 이어지게 된다면 퇴근하고 출근인 역순으로 되어서 정답 체크가 되지 않습니다. 그렇기 때문에 어떤 출근의 흔적도 없는 0이하가 된다면? -가 등장했을때는 야근을 한번 했다는 것으로 체크해야합니다. 그래서 두개의 map을 사용해서 문제를 해결해야 합니다. 이 부분은 조금은 생각을 해야 나오는 부분이기 때문에 천천히 그림으로 표현해서 체크하시면 좋을 것 같습니다. 아래는 정답 코드입니다. 그리고 정답 체크할때 기본에 있던 map과 정답을 체크하는 answer map을 전부 파악해야 합니다.

//https://www.acmicpc.net/problem/14402

#include<iostream>
#include<map>

using namespace std;

int testCase;
string name;
char c;
map<string,int> m,answer;

int main() {
	
	cin >> testCase;
	
	for(int i = 0; i < testCase; i++){
		cin >> name >> c;
		
		if(c == '+'){ // 출근을 했는데
			
			m[name] += 1;
			
		} else {
			
			if(m[name] <= 0){
				answer[name] += 1;
			} else{
				m[name] -= 1;
			}
			
		}
	}
	
	int res = 0;
	
	for(auto iter = m.begin(); iter != m.end(); iter++){
		res += iter->second;
		res += answer[iter->first];
	}
	
	cout << res;
	
	return 0;
}

'PS > BaekJoon' 카테고리의 다른 글

[C++/26042] 식당 입구 대기 줄  (0) 2024.08.31
[C++/8891] 점 숫자  (0) 2024.08.28
[C++/2594] 놀이공원  (0) 2024.08.23
[C++/16958] 텔레포트  (0) 2024.08.14
[C++/27210] 신을 모시는 사당  (0) 2024.08.09