알고리즘/백준
[BAEKJOON]7785 회사에 있는 사람
응애~ 개발자
2025. 5. 12. 02:16
728x90
반응형
문제 요약
- 알고리즘 분류: 집합
- 난이도: Silver5
- 문제내용:
- 사람 이름하고 "enter"나 "leave"가 주어진다.
- "enter"인 경우는 출근, "leave"인 경우는 퇴근이다.
- 출근 한 사람 역순으로 출력해라
- 사이트: https://www.acmicpc.net/problem/7785
문제풀이
이번 문제는 간단한 집합문제이다. 각 언어마다 Set이라는 자료 구조만 활용 잘하면 된다. Set에 대한 기본 설명 하면 아래와 같다.
- O(1) 시간에 추가/삭제 가능
- 자동으로 중복 제거
- 빠른 검색 가능
구현은 아래와 같이 하면 된다.
- enter 기록은 Set에 추가
- leave 기록은 Set에서 제거
- 마지막에 Set의 내용을 역순 정렬하여 출력
마무리
위와 같이 구현 하면 시간 복잡도는 정렬 때문에 O(NlogN) 만큼 나온다.
이 문제는 Set 자료구조의 기본적인 활용법을 이해하고 있다면 쉽게 해결할 수 있다.
Code
Python
# 현재 회사에 있는 사람들의 이름을 저장할 Set
names = set({})
for _ in range(int(input())):
# 각 로그를 공백으로 분리하여 이름과 상태를 파싱
name, action = input().split()
#"enter"면 사람을 회사에 추가, "leave"면 회사에서 제거
if action == "enter":
names.add(name)
else:
names.remove(name)
# 사전순 역순으로 정렬하여 출력
for name in sorted(names, reverse=True):
print(name)
Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
// 현재 회사에 있는 사람들의 이름을 저장할 HashSet
Set<String> names = new HashSet<>();
for (int i = 0; i < n; i++) {
// 각 로그를 읽어서 이름과 상태(enter/leave)를 파싱
st = new StringTokenizer(br.readLine());
String name = st.nextToken();
// "enter"면 사람을 회사에 추가, "leave"면 회사에서 제거
if (st.nextToken().equals("enter")) {
names.add(name);
}else{
names.remove(name);
}
}
// 현재 회사에 있는 사람들을 역순(사전순 역순)으로 정렬하여 출력
names.stream()
.collect(Collectors.toList())
.stream()
.sorted(Comparator.reverseOrder())
.forEach(System.out::println);
}
}
Javascript
var input = require('fs').readFileSync("/dev/stdin", "utf-8").toString().trim().split("\n");
const n = parseInt(input[0]);
// 현재 회사에 있는 사람들의 이름을 저장할 Set
const names = new Set();
// n개의 로그를 처리
for (let i = 1; i <= n; i++) {
// 각 로그를 공백으로 분리하여 이름과 상태를 파싱
const [name, action] = input[i].trim().split(' ');
// "enter"면 사람을 회사에 추가, "leave"면 회사에서 제거
if (action === "enter") {
names.add(name);
} else {
names.delete(name);
}
}
// 현재 회사에 있는 사람들을 배열로 변환 후
// 사전순 역순으로 정렬하여 출력
Array.from(names)
.sort() // 사전순 정렬
.reverse() // 역순으로 뒤집기
.forEach(name => console.log(name));
728x90
반응형