본문 바로가기

[백준] 7785번 회사에 있는 사람 | Java

@공공둘둘2025. 7. 10. 20:03

처음 나온답.

import java.util.*;
import java.util.Map;
import java.util.ArrayList;

public class LivingACompany {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int freq = sc.nextInt();
		
		String[] names = new String[freq];
		String[] ios = new String[freq];
		List<String> temp = new ArrayList<>();
		
		for (int i = 0; i < freq; i++) {
		names[i] = sc.next();
		ios[i] = sc.next();
	}
	for (int i = 0; i < freq; i++) {
		if(ios[i].equals("enter")) {
			if(!temp.contains(names[i])){
				temp.add(names[i]);
			} 
		}else if(ios[i].equals("leave"))
			temp.remove(names[i]);
	}
	temp.sort(Comparator.reverseOrder());
	
	for (String print : temp) {
		System.out.println(print);
	}
}

문제에서는 동명이인이 없다고 했으니 처음에는 이름이 두번이면 한번나온 이름만 담아 출력하려했다. 하지만 그런 접근은 아니였다. 다음은 [이름]과 [enter leave]을 각각 배열에 담아서 ios(enter/leave배열)가 ios.equlas("enter")일때 temp리스트에 이름이 없다면 temp리스트에 add하고 io가 leave일 때 해당이름을 해당 이름을 리스트에서 뺀다. 그리고 temp리스트를 sort메서드를 통해 정렬하고 출력하는 건데 시간 초과가 나왔다.

 

그래서 다음 set을 이용하여 풀었다.

import java.util.*;
import java.util.Map;
import java.util.ArrayList;
public class LivingACompany {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int freq = sc.nextInt();
		
		Set<String> person = new HashSet<>();
		
		for(int i = 0; i < freq; i++) {
			String name = sc.next();
			String io = sc.next();
			
			if(io.equals("enter")) {
				person.add(name);
			} else if(io.equals("leave")) {
				person.remove(name);
			}
			
			
		}
		List<String> list = new ArrayList<>(person);
		list.sort(Comparator.reverseOrder());
		
		for(String s : list) {
			System.out.println(s);
		}
	}
}

똑같이 횟수를 받고 그 횟수만큼 for문을 통해 입력을 받는데 set에 넣고 빼는 조건문을 for문에 포함시켰다.

io가 enter이면 name을 set에 넣고 io가 leave면 set에서 name을 뺏다. 그리고 정렬을 위해 set을 list로 바꾸고

sort(Comparator.reversedOrder())하여 출력했다. 비교적 넣고 빼고가 쉬운 Set 자료구조를 쓰는 것이 맞았다.

공공둘둘
@공공둘둘 :: 0022

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차