Algorithm/๋ฐฑ์ค€

๋ฐฑ์ค€ 7785๋ฒˆ : ํšŒ์‚ฌ์— ์žˆ๋Š” ์‚ฌ๋žŒ

giraffe_ 2023. 8. 30. 17:45

https://www.acmicpc.net/problem/7785

 

7785๋ฒˆ: ํšŒ์‚ฌ์— ์žˆ๋Š” ์‚ฌ๋žŒ

์ฒซ์งธ ์ค„์— ๋กœ๊ทธ์— ๊ธฐ๋ก๋œ ์ถœ์ž… ๊ธฐ๋ก์˜ ์ˆ˜ n์ด ์ฃผ์–ด์ง„๋‹ค. (2 ≤ n ≤ 106) ๋‹ค์Œ n๊ฐœ์˜ ์ค„์—๋Š” ์ถœ์ž… ๊ธฐ๋ก์ด ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง€๋ฉฐ, ๊ฐ ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์ด ์ฃผ์–ด์ง€๊ณ  "enter"๋‚˜ "leave"๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. "enter"์ธ ๊ฒฝ์šฐ๋Š”

www.acmicpc.net

 

 

 

 

 

๋ฌธ์ œ

  • ๊ธฐ๋ก๋œ ์ถœ์ž… ๊ธฐ๋ก์˜ ์ˆ˜ n์ด ์ฃผ์–ด์ง„๋‹ค. (2 ≤ n ≤ 10^6)
  • ๊ฐ ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์ด ์ฃผ์–ด์ง€๊ณ  "enter"์ธ ๊ฒฝ์šฐ๋Š” ์ถœ๊ทผ, "leave"์ธ ๊ฒฝ์šฐ๋Š” ํ‡ด๊ทผ
  • ํšŒ์‚ฌ์—๋Š” ๋™๋ช…์ด์ธ์ด ์—†์œผ๋ฉฐ, ๋Œ€์†Œ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„
  • ํ˜„์žฌ ํšŒ์‚ฌ์— ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์„ ์‚ฌ์ „ ์ˆœ์˜ ์—ญ์ˆœ์œผ๋กœ ํ•œ ์ค„์— ํ•œ ๋ช…์”ฉ ์ถœ๋ ฅ

 

 

 

 

 

ํ’€์ด

์‹ค๋ฒ„4 ๋ฌธ์ œ๋กœ ๋ง‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•  2๋…„ ์ „์— ์ด ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค๊ฐ€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋กœ ํ‹€๋ ธ์—ˆ๋‹ค. 2๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ํ’€์–ด๋ดค๋Š”๋ฐ, ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚œ ์ด์œ ๋ฅผ ๋ฐ”๋กœ ์ฐพ์•„ ๊ธˆ๋ฐฉ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. (2๋…„ ์‚ฌ์ด์— ์‹ค๋ ฅ์ด ๋Š˜์—ˆ์Œ์„ ์‹ค๊ฐํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค!)

 

 

 

 

 

๋ฌธ์ œ์— ์ฃผ์–ด์ง„๋Œ€๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ •๋ฆฌํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

1. ์ž๋ฃŒ๊ตฌ์กฐ์— enter์ธ ๊ฒฝ์šฐ์—๋Š” ์‚ฝ์ž…ํ•˜๊ณ , leave์ธ ๊ฒฝ์šฐ์—๋Š” ์ œ๊ฑฐํ•˜๊ณ 

2. ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ

3. ์ •๋ ฌ๋œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ํ•œ ๋ช…์”ฉ ์ถœ๋ ฅ

 

 

 

๋ณดํ†ต ๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ ์‚ฝ์ž…ํ•˜๊ณ , ์ค‘๊ฐ„์—์„œ ์ œ๊ฑฐ ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ƒ๊ฐํ•˜๋ฉด List๋ฅผ ๋– ์˜ฌ๋ฆฐ๋‹ค. ๊ทธ๋ž˜์„œ 2๋…„ ์ „์˜ ๋‚˜๋„ ArrayList๋กœ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ๋งž๊ฒŒ ๋˜์—ˆ๋‹ค. ๋‹น์‹œ์—๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ๋ณ„ ์ˆ˜ํ–‰์‹œ๊ฐ„์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅผ ๋•Œ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋งž์€ ๊ฒƒ ๊ฐ™์€๋ฐ, ์™œ ํ‹€๋ฆฐ ๊ฑด์ง€ ๋ชฐ๋ž๋‹ค.

 

 

 

  • ํฐ ์ž…๋ ฅ๊ฐ’ : (2 ≤ n ≤ 10^6) 

 ์ถœ์ž… ๊ธฐ๋ก์˜ ์ˆ˜๊ฐ€ ์ตœ๋Œ€ 10์˜ 6์Šน = ๋ฐฑ๋งŒ์ด๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ, O(n^2)์ด์ƒ์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜๊ฒŒ ๋œ๋‹ค. n๊ฐœ์˜ ์ถœ์ž… ๊ธฐ๋ก์„ ์ˆœํšŒํ•˜๋ฉด์„œ ์‚ฝ์ž…๊ณผ ์ œ๊ฑฐ๋ฅผ ํ•˜๋Š” ๋ฐ n๋ฏธ๋งŒ์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ค์•ผ ํ•œ๋‹ค. ์ž๋ฃŒ๊ตฌ์กฐ ๋ณ„ ์‚ฝ์ž…๊ณผ ์ œ๊ฑฐ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค!

 

 

  • ์ž๋ฃŒ๊ตฌ์กฐ ๋ณ„ ์ˆ˜ํ–‰ ์‹œ๊ฐ„ : ArrayList VS HashSet

 ArrayList๋Š” ์‚ฝ์ž…์— O(1), ์ค‘๊ฐ„ ์›์†Œ ์ œ๊ฑฐ์— O(n)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. ๋ฌธ์ œ์—์„œ ์‚ฝ์ž… ์—ฐ์‚ฐ์€ ๊ดœ์ฐฎ์€๋ฐ, ์ œ๊ฑฐ ์—ฐ์‚ฐ์ด O(n)์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚ฌ์„ ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿผ ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘, ์ค‘๊ฐ„์—์„œ ์ œ๊ฑฐํ•˜๋Š” ์—ฐ์‚ฐ์—์„œ O(1)๋งŒํผ์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค. ์ƒ๊ฐ๋‚˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋Š” HashMap, HashSet, Queue, Stack (์ƒ์ˆ˜์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€๋งŒ ์ค‘๊ฐ„์—์„œ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋‹ค) ์ด๋‹ค.

 

HashMap, HashSet ์ค‘ ์–ด๋–ค ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์จ์•ผํ• ๊นŒ? ๋ฌธ์ œ๋ฅผ ์ž์„ธํžˆ ์ฝ์–ด๋ณด๋ฉด, 'ํšŒ์‚ฌ์—๋Š” ๋™๋ช…์ด์ธ์ด ์—†๋‹ค'๊ฐ€ ์žˆ๋‹ค. ์ฆ‰, ์ค‘๋ณต์„ ํ—ˆ๋ฝํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋‘˜ ์ค‘ ์ค‘๋ณต์„ ํ—ˆ๋ฝํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•˜๋ฉด HashSet์ด๋‹ค. HashMap์€ key์™€ value๋กœ ๊ตฌ์„ฑ์ด ๋˜๊ณ , key ๊ฐ’๋งŒ ๊ฒน์น˜์ง€ ์•Š๋Š”๋‹ค๋ฉด value๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์žˆ๋‹ค.

 

HashSet์€ ์‚ฝ์ž…์— O(1), ์ œ๊ฑฐ์— O(1)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. ๋”ฐ๋ผ์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

 

 

 

  • HashSet ์ •๋ ฌ

HashSet ์ •๋ ฌ์„ ์œ„ํ•ด์„œ๋Š” ArrayList๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ์— ArrayList๋ฅผ ์ •๋ ฌํ•ด์•ผ ํ•œ๋‹ค.

 

 

 

 

 

์ฝ”๋“œ

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));
		
		int N = Integer.parseInt(br.readLine());
		
		HashSet<String> set = new HashSet<>();
		
		for(int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine(),  " ");
			String name = st.nextToken();
			String statement = st.nextToken();
			
			if(statement.equals("enter")) {
				set.add(name);
			} else {
				set.remove(name);
			}
		}
		
		//์ •๋ ฌ
		List<String> list = new ArrayList<String>(set);
		Collections.sort(list, Collections.reverseOrder());
		
		//์ถœ๋ ฅ
		StringBuilder sb = new StringBuilder();
		
		for(String str : list) {
			sb.append(str + "\n");
		}
		
		System.out.println(sb);
	}

}

 

 

 

 

 

๊ฒฐ๊ณผ

 

 

 

 

 

๋ฐฐ์šด์ 

  • HashSet
    • ์ˆ˜ํ–‰์‹œ๊ฐ„ : ์‚ฝ์ž…O(1), ์ œ๊ฑฐO(1)
    • ์ •๋ ฌ : List<String> list = new ArrayList<String>(set);
  • ๋ฆฌ์ŠคํŠธ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ : Collections.sort(list, Collections.reverseOrder());