⛔ 단순히 기록용 입니다... 어떻게 풀었는가 생각도 다시 해보고 그러니까 아마도 도움은 안되실 것 같습니다.
야근 듣기만해도 오늘 내가 일을 못했구나 하는 느낌입니다. 야근하지 않기 위해서는 일에 몰입해야겠죠. 또는 일이 너무 많아서 야근을 하게 된다면 일단 최선을 다해야된다고 생각합니다. 왜냐면 어쨌든 저는 조직 소속이니까요.
이 문제는 야근을 한 인원이 몇명인지 파악하는 문제입니다. 조건은 아래와 같습니다.
" 만약, 들어간 기록은 없는데, 나온 기록이 있다면 회사에서 야근을 한 것으로 기록된다. 또한 회사에 들어갔는데, 퇴근시간까지 나오지 않는다면, 이 또한 야근을 하는 것으로 기록된다. 출입기록에 따라서 두 기준 다 만족할 수도 있는데, 이는 야근을 두 번 한 것으로 인정된다. "
들어간 기록은 없는데, 나온 기록이 있다면? 언제 들어갔는지 파악할 수 없기 때문에 야근으로 칩니다. 그리고 퇴근시간까지 나오지 않았다면? 즉 나온 흔적이 없다면? 야근이라는 말입니다. 그리고 출입기록에 따라서 두 기준을 다 만족할 수 있는데 이 조건은 중복해서 체크하지 말라는 말인것 같습니다. 순차적으로 입력값을 파악하면 되는 문제입니다.
일단 들어가는건 무조건 체크를 해주고 빠져나오는것도 무조건 체크를 해주면서 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 |