본문 바로가기
코딩테스트/구현

[시뮬레이션] 야근(14402)

by ChaeChae's Blog 2021. 9. 19.

📜 문제 설명

 

영선회사는 야근이 매우 잦은 회사이다. 다행히도 야근수당을 챙겨 주기는 하는데, 사장 nein은 매우 악덕한 사장이기 때문에 최대한 야근 수당을 안 챙겨주려 한다.

영선회사의 야근인지 확인하는 방법은 다음과 같다. 매우 이른 아침부터 퇴근시간까지 출입기록이 주어진다. 만약, 들어간 기록은 없는데, 나온 기록이 있다면 회사에서 야근을 한 것으로 기록된다. 또한 회사에 들어갔는데, 퇴근시간까지 나오지 않는다면, 이 또한 야근을 하는 것으로 기록된다. 출입기록에 따라서 두 기준 다 만족할 수도 있는데, 이는 야근을 두 번 한 것으로 인정된다. 하지만, 회사에 계속 있었지만 나오거나 들어가지를 않아 출입기록이 없다면 야근을 한 것으로 인정하지 않는다.

그리고 이 출입기록에는 치명적인 단점이 있는데, 동명이인을 구별하지 못한다는 것이다. 이름이 같은 경우, 같은 사람으로 인식하며, 둘 다 회사에 남아있거나 들어간 기록 없이 나온 기록이 있는 식으로, 명확히 보이는 경우에만 복수로 야근이 인정된다.

영선회사의 오늘의 출입기록이 주어진다. 이 기록을 바탕으로 모든 직원의 야근 횟수의 합을 출력하시오.


입력

첫째 줄에는 출입기록의 개수 q가 주어진다.( 1≤q≤100,000)

다음 q줄에는 이름 s와 들어간 지 나간 지에 대한 정보 p가 주어지는데, p는 ‘+’일 때 들어간 것이고, ‘-‘일 때 나간 것이다. 이름의 길이는 30자를 넘지 않는다. 이름은 소문자로만 이루어져 있다.


출력

출입기록을 바탕으로 모든 직원의 야근 횟수의 합을 출력하시오.


입출력 예시

input result
7 5
nein +
nein -
nein -
nein -
nein +
nein +

 


💡 문제 풀이

 

처음에는 회사에 들어간 이름을 스택으로 관리하려다가 동명이인을 해결할 수 가 없을 거 같아서 딕셔너리로 방법을 바꿨다.

아래와 같은 경우의 수로 문제를 해결했다.

1. 출근O
   - 딕셔너리에 key는 이름, value는 동명이인 수
2. 출근O 퇴근O
    - 딕셔너리의 해당 이름의 값 -1
3. 출근X 퇴근O
    - 무조건 야근 (count 증가)
4. 출근O 퇴근X
    - 딕셔너리에 존재함(무조건 야근)

 

import sys
input = sys.stdin.readline

q = int(input())
dic = {}
count =0
for _ in range(q):
  info = list(input().split())
  name, data = info[0], info[1]

  if data == '-': 
    if name not in dic or dic[name] == 0:  #3
      count +=1
    elif name in dic: #2
      dic[name] -=1
      
  else: #1
    if name not in dic:
      dic[name] = 1
    else:
      dic[name] += 1

#야근하는 총 직원 수
if len(dic) == 0:
  print(count)
else:
  print(sum(dic.values()) + count)

📝 후기

 

실버4라서 그런가 어렵지 않았다. 다음에는 실버3 난이도 문제를 풀어야지!💪

 

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

 

14402번: 야근

영선회사는 야근이 매우 잦은 회사이다. 다행히도 야근수당을 챙겨 주기는 하는데, 사장 nein은 매우 악덕한 사장이기 때문에 최대한 야근 수당을 안 챙겨주려 한다. 영선회사이 야근인지 확인하

www.acmicpc.net