Java/백준알고리즘

[Java] 백준알고리즘 #7785 회사에 있는 사람

Sehyeok20 2023. 10. 26. 19:37
반응형

백준알고리즘 #7785 회사에 있는 사람

이름과 출입여부를 공백을 두고 입력받고, enter라면 출근, leave 라면 퇴근으로 할 때,

모든 입력이 끝난 후 회사에 남아 있는 사람의 이름을 출력하는 문제.

사전순의 역순으로 출력한다는 점에 주의할 것.

 

Hashset을 이용하여 회사원들의 출입관리를 하면 될 듯 하다.

2023.10.17 - [Java/개념정리] - [Java] HashSet 에 대해 알아보자

 

[Java] HashSet 에 대해 알아보자

Set Interface 기본적으로 Set혹은 Set계열을 구현하는 클래스들은 다음과 같은 공통점이 있다. 중복되는 요소(원소)를 허용하지 않는다. 저장 순서를 유지하지 않는다. (LinkedHashSet 만 예외) HashSet HashS

sehyeok.tistory.com

 

문자열 분리는 StringTokenizer를 사용하면 간단히 해결.

2023.10.25 - [Java/개념정리] - [Java] 문자열 분리 (split, StringTokenizer 사용법)

 

[Java] 문자열 분리 (split, StringTokenizer 사용법)

문자열을 입력 받을 때 공백이 포함된 상태로 여러개의 입력을 받는 경우가 있다. 대표적으로 BufferedReader를 이용하여 입력받을 때는 줄 단위로 입력을 받기 때문에 여러 문자들을 나열한 문자열

sehyeok.tistory.com

 

반복문을 통해 입력받으면서 해당 사원의 상태가 leave 라면 Hash에서 제거해준다.(remove()메소드 이용)

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine()); 
HashSet<String> worker = new HashSet<String>(); // Hash 생성

for (int i = 0; i < n; i++) {
    StringTokenizer st = new StringTokenizer(br.readLine()); // 입력받은 문자열 분리
    String name = st.nextToken(); 	// 분리한 문자의 첫번째(이름)
    String status = st.nextToken();	// 분리한 문자의 두번째(상태)
    worker.add(name);			// Hash에 이름 추가
    if (status.equals("leave")) {	// leave 인 경우에는
        worker.remove(name);		// Hash에서 해당 사원 이름 삭제
    }
}

 

위 과정을 거치고 나면 Hash에는 회사에 남아 있는 사원들의 이름만 저장되어 있을 것이다.

이제 역순으로 정렬해서 출력해보자.

 

Hashset에는 toArray라는 메소드가 있다. 이는 Hash에 저장된 모든 원소들을 갖는 배열을 만들어 주는 메소드이다.

출처 : https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Set.html#toArray()

이를 이용해 배열로 바꿔 준 후, Arrays.sort기능을 이용해서 정렬해주자.

2023.10.20 - [Java/개념정리] - [Java] 배열 정렬하기 (Arrays.sort(), Collections.reverseOrder() 사용)

 

[Java] 배열 정렬하기 (Arrays.sort(), Collections.reverseOrder() 사용)

Arrays.sort() 자바에서 배열이나 리스트를 정렬하고 싶을 때 java.util.Arrays 클래스의 sort() 메서드를 사용하면 따로 정렬 알고리즘을 짜지 않고도 한번의 메소드 호출로 간편하게 배열이나 리스트를

sehyeok.tistory.com

String[] ary = worker.toArray(new String[worker.size()]);	// Hash 원소로 배열 만들기
Arrays.sort(ary, Collections.reverseOrder());			// 사전 역순 정렬

for (String s : ary) {						// 출력
    System.out.println(s);
}

마지막으로 반복문을 통해 배열의 원소를 한줄씩 출력해주면 완성.

 

전체 코드는 다음과 같다.

// 해설참조 : sehyeok.tistory.com 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.StringTokenizer;

public class Main {
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        HashSet<String> worker = new HashSet<String>(); // Hash 생성

        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine()); // 입력받은 문자열 분리
            String name = st.nextToken(); 	// 분리한 문자의 첫번째(이름)
            String status = st.nextToken();	// 분리한 문자의 두번째(상태)
            worker.add(name); 			// Hash에 이름 추가
            if (status.equals("leave")) { 	// leave 인 경우에는
                worker.remove(name); 		// Hash에서 해당 사원 이름 삭제
            }
        }
        String[] ary = worker.toArray(new String[worker.size()]); // Hash 원소로 배열 만들기
        Arrays.sort(ary, Collections.reverseOrder()); 		// 사전 역순 정렬

        for (String s : ary) { 					// 출력
            System.out.println(s);
        }
    }
}
반응형