B7785 회사에 있는 사람
날짜 | 2024-03-28 |
사용 언어 | Java |
문제 유형 | 자료 구조, 해시를 사용한 집합과 맵 |
문제 URL | https://www.acmicpc.net/problem/7785 |
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 256 MB | 51726 | 21250 | 16152 | 40.692% |
문제 #
문제 설명 #
상근이는 세계적인 소프트웨어 회사 기글에서 일한다. 이 회사의 가장 큰 특징은 자유로운 출퇴근 시간이다. 따라서, 직원들은 반드시 9시부터 6시까지 회사에 있지 않아도 된다.
각 직원은 자기가 원할 때 출근할 수 있고, 아무때나 퇴근할 수 있다.
상근이는 모든 사람의 출입카드 시스템의 로그를 가지고 있다. 이 로그는 어떤 사람이 회사에 들어왔는지, 나갔는지가 기록되어져 있다. 로그가 주어졌을 때, 현재 회사에 있는 모든 사람을 구하는 프로그램을 작성하시오.
제한사항 #
-
첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 106)
-
다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 “enter"나 “leave"가 주어진다.
-
“enter"인 경우는 출근, “leave"인 경우는 퇴근이다.
-
회사에는 동명이인이 없으며, 대소문자가 다른 경우에는 다른 이름이다.
-
사람들의 이름은 알파벳 대소문자로 구성된 5글자 이하의 문자열이다.
-
현재 회사에 있는 사람의 이름을 사전 순의 역순으로 한 줄에 한 명씩 출력한다.
나의 풀이 #
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int count = Integer.parseInt(br.readLine());
List<String> attendance = new ArrayList<>();
for (int i = 0; i<count; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String name = st.nextToken();
String attend = st.nextToken();
if (attend.equals("enter")) {
attendance.add(name);
} else {
attendance.remove(name);
}
}
attendance.sort(Comparator.reverseOrder());
for (String name : attendance) {
bw.write(name+"\n");
}
br.close();
bw.close();
}
}
- 시간 초과 발생
- Collections.sort 사용 시에도 시간 초과 발생
- List보다 수정,삭제가 빠른 Set을 활용 할 수 있다.
- HashSet은 순서가 없으므로, 사전 순의 역순으로 출력하기 위해 TreeSet활용
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int count = Integer.parseInt(br.readLine());
// 출결 리스트 작성
TreeSet<String> attendance = new TreeSet<>();
for (int i = 0; i<count; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String name = st.nextToken();
String attend = st.nextToken();
if (attend.equals("enter")) {
attendance.add(name);
} else {
attendance.remove(name);
}
}
// attendance.descendingSet() 내림차순 정렬
for (String name : attendance.descendingSet()) {
bw.write(name+"\n");
}
br.close();
bw.close();
}
}
다른 사람의 풀이 #
관련개념 학습 #
https://blog.naver.com/kimstcool01/220896128159