๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Problem Solving

[Java] ๋ฐฑ์ค€ 31792 - ํ•œ๋น›๋ฏธ๋””์–ด (Hard)

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

๋ฌธ์ œ


ํ’€์ด

์‚ฝ์ž…/์‚ญ์ œ/ํƒ์ƒ‰ ๋ชจ๋‘ ์‹œ๊ฐ„ ๋ณต์žก๋„ O(logN)์— ๊ฐ€๋Šฅํ•œ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์งˆ์˜ 3 (ํƒ์ƒ‰) ๊ฐ™์€ ๊ฒฝ์šฐ ๊ทธ๋ฆฌ๋””ํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ๋ƒฅ ๊ฐ€๊ฒฉ์ด ๋‚ฎ์€ ์ฑ…๋ถ€ํ„ฐ ์ง„์—ดํ•˜๋‹ค๊ฐ€ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. ๋ฌผ๋ก  ํ•˜๋‚˜ํ•˜๋‚˜์”ฉ ํƒ์ƒ‰ํ•˜๋ฉด O(N)์ด ๋˜๋ฏ€๋กœ S = S * 2  ๊ฐ™์€ ์‹์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ธฐ. (TreeMap.higerKey(Key k) ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์‰ฌ์›€) 


์ฝ”๋“œ

๋”๋ณด๊ธฐ
import java.io.*;
import java.util.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int Q = Integer.parseInt(br.readLine());
		TreeMap<Integer, Integer> map = new TreeMap<>();

		while (Q-- > 0) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int cmd, S;
			cmd = Integer.parseInt(st.nextToken());

			switch (cmd) {
			case 1:
				S = Integer.parseInt(st.nextToken());
				map.put(S, map.getOrDefault(S, 0) + 1);
				break;
			case 2:
				S = Integer.parseInt(st.nextToken());
				if (map.containsKey(S)) {
					map.put(S, map.get(S) - 1);
					if (map.get(S) == 0) {
						map.remove(S);
					}
				}
				break;
			case 3:
				int pageCnt = 0;
				if (map.size() > 0) {
					Integer curS = map.firstKey();
					pageCnt++;

					while ((curS = map.higherKey(curS * 2 - 1)) != null) {
						pageCnt++;
					}
				}
				sb.append(pageCnt).append('\n');
				break;
			}
		}

		System.out.println(sb);
		br.close();
	}
}