Problem Solving/Baekjoon

[백준] 7785 회사에 있는 사람 - Data Structure / Java

graycode 2022. 7. 25. 18:55

 문제 링크

 

7785번: 회사에 있는 사람

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

www.acmicpc.net

 

 풀이 과정

문제에 제시된 조건 중 동명이인이 없음, 즉 중복을 허용하지 않으므로 Set 자료구조를 활용한다.

또는 Map 자료구조의 key 값으로 구현 가능하며 이때 Set 과 Map 은 List 대비 속도면에서 우위를 가진다.

 

입력받은 출입 기록 중 state 변수에 저장된 문자열이 "enter" 일때 Set 에 name 값을 저장하고

그 외의 경우는 state = "leave" 로써 Set 에 입력된 name 값이 존재 시, 해당 값을 삭제한다.

 

값 입출이 완료된 Set 을 List 자료구조로 변환 및 내림차순으로 정렬하여 모든 요소를 정답으로써 출력한다.

 

 풀이 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;

		int n = Integer.parseInt(br.readLine());

		Set<String> log = new HashSet<>();
		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine());
			String name = st.nextToken();
			String state = st.nextToken();

			if (state.equals("enter"))
				log.add(name);
			else if (log.contains(name))
				log.remove(name);
		}

		List<String> list = new ArrayList<>(log);
		list.sort(Comparator.reverseOrder());

		for (String s : list)
			bw.write(s + "\n");

		bw.flush();
	}

}