티끌모아 태산

7785: 회사에 있는 사람 본문

백준 문제/해시

7785: 회사에 있는 사람

goldpig 2024. 3. 27. 14:41
728x90

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

 

7785번: 회사에 있는 사람

첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 106) 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다. "enter"인 경우는

www.acmicpc.net

설명

상근이는 세계적인 소프트웨어 회사 기글에서 일한다. 이 회사의 가장 큰 특징은 자유로운 출퇴근 시간이다. 따라서, 직원들은 반드시 9시부터 6시까지 회사에 있지 않아도 된다. 각 직원은 자기가 원할 때 출근할 수 있고, 아무때나 퇴근할 수 있다.

상근이는 모든 사람의 출입카드 시스템의 로그를 가지고 있다. 이 로그는 어떤 사람이 회사에 들어왔는지, 나갔는지가 기록되어져 있다. 로그가 주어졌을 때, 현재 회사에 있는 모든 사람을 구하는 프로그램을 작성하시오.

핵심 아이디어

주어진 문제는 로그 기록이 주어졌을 때, 회사에 남아 있는 사람의 수를 구하는 문제다. 

  • 딕셔너리를 활용하자 
  • 딕셔너리 말고 리스트로 풀면 시간초과 발생.
  • 딕셔너리(해시맵) 구조는 해시맵을 통해 key:value 값으로 저장되며, 추가 삭제 연산이 매우 빠르다.

옵션 1: 회사에는 동명인이 없으며, 대소문자를 구분한다. 

옵션 2: 이름을 사전 순의 역순으로 한 줄에 한명 씩 출력한다. -> 정렬 알고리즘 활용

코드 구현

Python

import sys
input = sys.stdin.readline

n = int(input())
arr = {} # 딕셔너리 형태
for _ in range(n):
	# 이름과 상태 구하기
	a,b = input().split().rstrip()
	if b == 'enter': # 출근 했다면
		arr[a] = b
	else:
		del arr[a] # 삭제: 퇴근했다는 뜻.
arr = sorted(arr.keys(), reverse=True)
for i in arr:
	print(i)

C++

Python의 key와 value를 담는 dictionary 자료형이 있듯이 C++에도 key와 value 담을 수 있는 map 자료형이 있다. dictionary는 해시 테이블로 구성되는 반면, map은 트리(레드 블랙 트리)로 구성된다는 차이점이 있다. #include <map>와 같이 map 헤더파일을 불러오면 map 자료형을 사용할 수 있다.

map 자료형은 다음과 같이 map <key, value, (compare)> var;로 선언한다. map은 기본적으로 key를 기준으로 오름차순으로 정렬하므로 변수를 선언 시, greater<type>을 compare에 추가해주면 내림차순으로 정렬할 수 있다. 반복문을 통하여 var[key] = value;로 log에 저장한 후, iterator를 통하여 value(it->second)의 값이 "enter"인 경우 출력하도록 하였다.

#include <iostream>
#include <map>
#include <string>
using namespace std;


int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	int n;
	string a, b;
	// 딕셔너리 선언 후 내림 차순으로 정렬
	map <string, string, greater<string>> arr;
	
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a >> b;
		// key:value 형태로 저장
		arr[a] = b;
	}
	map<string, string>::iterator it;
	for (it = arr.begin(); it != arr.end(); it++) {
		if (it->second == "enter") {
			cout << it->first << "\n";
		}
	}

	return 0;
}
728x90

'백준 문제 > 해시' 카테고리의 다른 글

16165: 걸그룹 마스터 준석이  (0) 2024.03.27
17219: 비밀번호 찾기  (0) 2024.03.27