Post

๐Ÿงฉ Baekjoon 1052 - ๋ฌผ๋ณ‘

๐Ÿงฉ Baekjoon 1052 - ๋ฌผ๋ณ‘

๋ฌธ์ œ

์ง€๋ฏผ์ด๋Š” N๊ฐœ์˜ ๋ฌผ๋ณ‘์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ฐ ๋ฌผ๋ณ‘์—๋Š” ๋ฌผ์„ ๋ฌดํ•œ๋Œ€๋กœ ๋ถ€์„ ์ˆ˜ ์žˆ๋‹ค. ์ฒ˜์Œ์— ๋ชจ๋“  ๋ฌผ๋ณ‘์—๋Š” ๋ฌผ์ด 1๋ฆฌํ„ฐ์”ฉ ๋“ค์–ด์žˆ๋‹ค. ์ง€๋ฏผ์ด๋Š” ์ด ๋ฌผ๋ณ‘์„ ๋˜ ๋‹ค๋ฅธ ์žฅ์†Œ๋กœ ์˜ฎ๊ธฐ๋ ค๊ณ  ํ•œ๋‹ค. ์ง€๋ฏผ์ด๋Š” ํ•œ ๋ฒˆ์— K๊ฐœ์˜ ๋ฌผ๋ณ‘์„ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค.ย 
ํ•˜์ง€๋งŒ, ์ง€๋ฏผ์ด๋Š” ๋ฌผ์„ ๋‚ญ๋น„ํ•˜๊ธฐ๋Š” ์‹ซ๊ณ , ์ด๋™์„ ํ•œ ๋ฒˆ๋ณด๋‹ค ๋งŽ์ด ํ•˜๊ธฐ๋Š” ์‹ซ๋‹ค. ๋”ฐ๋ผ์„œ, ์ง€๋ฏผ์ด๋Š” ๋ฌผ๋ณ‘์˜ ๋ฌผ์„ ์ ์ ˆํžˆ ์žฌ๋ถ„๋ฐฐํ•ด์„œ, K๊ฐœ๋ฅผ ๋„˜์ง€ ์•Š๋Š” ๋น„์–ด์žˆ์ง€ ์•Š์€ ๋ฌผ๋ณ‘์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค.

๋ฌผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์žฌ๋ถ„๋ฐฐ ํ•œ๋‹ค. ๋จผ์ € ๊ฐ™์€ ์–‘์˜ ๋ฌผ์ด ๋“ค์–ด์žˆ๋Š” ๋ฌผ๋ณ‘ ๋‘ ๊ฐœ๋ฅผ ๊ณ ๋ฅธ๋‹ค. ๊ทธ ๋‹ค์Œ์— ํ•œ ๊ฐœ์˜ ๋ฌผ๋ณ‘์— ๋‹ค๋ฅธ ํ•œ ์ชฝ์— ์žˆ๋Š” ๋ฌผ์„ ๋ชจ๋‘ ๋ถ“๋Š”๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ํ•„์š”ํ•œ ๋งŒํผ ๊ณ„์† ํ•œ๋‹ค.
์ด๋Ÿฐ ์ œ์•ฝ ๋•Œ๋ฌธ์—, N๊ฐœ๋กœ K๊ฐœ๋ฅผ ๋„˜์ง€์•Š๋Š” ๋น„์–ด์žˆ์ง€ ์•Š์€ ๋ฌผ๋ณ‘์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋‹คํ–‰ํžˆ๋„, ์ƒˆ๋กœ์šด ๋ฌผ๋ณ‘์„ ์‚ด ์ˆ˜ ์žˆ๋‹ค. ์ƒ์ ์—์„œ ์‚ฌ๋Š” ๋ฌผ๋ณ‘์€ ๋ฌผ์ด 1๋ฆฌํ„ฐ ๋“ค์–ด์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, N=3์ด๊ณ , K=1์ผ ๋•Œ๋ฅผ ๋ณด๋ฉด, ๋ฌผ๋ณ‘ 3๊ฐœ๋กœ 1๊ฐœ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•œ ๋ณ‘์„ ๋˜๋‹ค๋ฅธ ๋ณ‘์— ๋ถ€์œผ๋ฉด, 2๋ฆฌํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฌผ๋ณ‘ ํ•˜๋‚˜์™€, 1๋ฆฌํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฌผ๋ณ‘ ํ•˜๋‚˜๊ฐ€ ๋‚จ๋Š”๋‹ค. ๋งŒ์•ฝ ์ƒ์ ์—์„œ ํ•œ ๊ฐœ์˜ ๋ฌผ๋ณ‘์„ ์‚ฐ๋‹ค๋ฉด, 2๋ฆฌํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฌผ๋ณ‘ ๋‘ ๊ฐœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ 4๋ฆฌํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฌผ๋ณ‘ ํ•œ ๊ฐœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N๊ณผ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. N์€ 10^7๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๊ณ , K๋Š” 1,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ƒ์ ์—์„œ ์‚ฌ์•ผํ•˜๋Š” ๋ฌผ๋ณ‘์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ์ •๋‹ต์ด ์—†์„ ๊ฒฝ์šฐ์—๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ

โœ… ์ž…๋ ฅ 1

1
3 1

โœ… ์ถœ๋ ฅ 1

1
1

โœ… ์ž…๋ ฅ 2

1
13 2

โœ… ์ถœ๋ ฅ 2

1
3

โœ… ์ž…๋ ฅ 3

1
1000000 5

โœ… ์ถœ๋ ฅ 3

1
15808

์ž‘์„ฑ ์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class Main {
	public static void main(String[] args) throws IOException {
		// 1. ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™”
		PriorityQueue<Integer> pq = new PriorityQueue<>();
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());
		int count = 0, result = 0, amount = 1;
		
		// 2. ๋ฌผ๋ณ‘ ํฌ๊ธฐ ๊ตฌํ•˜๊ธฐ
		while (n > 0) {
			if ((n & 1) == 1) {
				pq.add(amount);
				count++;
			}
			amount *= 2;
			n /= 2;
		}
		
		// 3. ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ๊นŒ์ง€ ๊ฐ€์žฅ ์ž‘์€ ๋ฌผ๋ณ‘ ๋‘ ๊ฐœ๋ฅผ ํ•ฉ์นจ
		while (count > k) {
			if (pq.size() >= 2) {
				// ๊ฐ€์žฅ ์ž‘์€ ๋‘ ๊ฐœ ๋ฌผ๋ณ‘ ๊บผ๋‚ด๊ธฐ
				int first = pq.poll();
				int second = pq.poll();
				
				// ๊บผ๋‚ธ ๋‘ ๋ฌผ๋ณ‘์ด ๊ฐ™์œผ๋ฉด ์นด์šดํŠธ ๋‹ค์šด
				if (first == second) {
					pq.add(first + second);
					count--;
					continue;
				}
				
				// ๊ตฌ๋งคํ•ด์•ผ ํ•˜๋Š” ๋ฌผ๋ณ‘ ์ˆ˜ ๋ˆ„์ 
				result += (second - first);
				
				// ์ฑ„์šด ๋ฌผ๋ณ‘์„ ๋‹ค์‹œ ์ ์žฌ
				pq.add(second);
				pq.add(second);
			}
		}
		
		// 4. ์ถœ๋ ฅ
		System.out.println(result);
	}
}
  • ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Greedy ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€์—ˆ๋‹ค.

ํšŒ๊ณ 

  • ์šฐ์„ ์ˆœ์œ„ ํ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋Š” ๋‹ค์Œ ๋ธ”๋กœ๊ทธ์—์„œ ํ™•์ธํ•˜์˜€๋‹ค.
  • https://coding-factory.tistory.com/603
  • ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์„ ๋น„ํŠธ ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ํšจ์œจ์ ์œผ๋กœ ๊ฐœ์„ ํ•˜์˜€๋‹ค.
  • if (n & 1 == 1)๊ณผ if (n % 2 == 1) ์กฐ๊ฑด ๋ชจ๋‘ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋น„ํŠธ ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•œ ๋ฐฉ๋ฒ•์ด CPU ๋ช…๋ น์–ด ์ˆ˜์ค€์—์„œ ์ตœ์ ํ™”๋˜๋ฏ€๋กœ ๋” ๋น ๋ฅด๋‹ค๊ณ  ํ•œ๋‹ค.
This post is licensed under CC BY 4.0 by the author.