[백준] 7785. 회사에 있는 사람

Jinyongmin·2024년 10월 17일

알고리즘 문제풀이

목록 보기
9/11

문제 링크

문제 설명

해시를 사용하는 간단한 문제로 풀기 전 고민했던 부분은 3가지가 있었다.
1. 문자열을 분리해서 이름과 출입 여부에 관한 문자열로 나눠야한다.
2. Set을 통해 동일한 이름의 직원이 중복해서 들어가지 않도록하며, 출입 여부에 따라 삽입, 삭제 해야한다.
3. 출력시, 알파벳 기준 내림차순으로 정렬해야한다.

TreeSet 사용한 풀이 (정답)

코드

import java.util.*;  
import java.io.*;  
  
public class Main {  
  
    public static void main(String[] args) throws IOException {  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
  
        Set<String> employees = new TreeSet<>(Collections.reverseOrder());  
  
        int n = Integer.parseInt(br.readLine());  
  
        for (int i = 0; i < n; i++) {  
            String temp = br.readLine();  
            String[] employ = temp.split(" ");  
  
            if(employ[1].equals("enter")){  
                employees.add(employ[0]);  
            }else{  
                employees.remove(employ[0]);  
            }  
        }  
  
        for (String employee : employees) {  
            System.out.println(employee);  
        }  
  
    }  
  
}

TreeSet

Set<String> employees = new TreeSet<>(Collections.reverseOrder());  
  • TreeSet은 기본적으로 오름차순으로 순서를 보장해서 저장하기 때문에 Collections.reverseOrder()를 사용하여 내림차순으로 저장되도록 한다.

문자열 분리

String[] employ = temp.split(" ");  

	if(employ[1].equals("enter")){  
		employees.add(employ[0]);  
	}else{  
		employees.remove(employ[0]);  
	}  
  • "Baha enter", "Baha leave" 등 공백을 기준으로 이름과 출입 여부에 관한 문자열이 나뉜다.
    • 공백을 기준으로 문자열을 분리해 배열에 저장해서 출입 여부에 따라 add, remove를 결정한다.

출력

// 방법 1
for (String employee : employees) {  
	System.out.println(employee);  
} 

// 방법 2
Iterator<String> iter = employees.iterator();  

while(iter.hasNext()){  
	System.out.println(iter.next());  
}
  • 방법 1
    • 이미 순서를 보장한 TreeSet을 사용했기 때문에 요소를 처음부터 하나씩 출력한다.
  • 방법 2
    • Iterator 타입으로 변환 후에 hasNext() 즉, 다음 요소가 있을 때까지 반복하며 출력한다.

결론

이전 문제에서 Set의 중요성에 대해서 좀 알 수 있었는데 TreeSet과 정렬 순서를 바꾸는 등, 이와 같은 것을 숙지해두고 실전 상황에서 바로 적용시킬 수 있도록 해야할 것 같다.

0개의 댓글