๐Ÿ“ Coding Test Study/Algorithm Problem

[C++][BOJ] 2792๋ฒˆ ๋ณด์„ ์ƒ์ž(feat. ์ด๋ถ„ ํƒ์ƒ‰)

ibelieveinme 2024. 5. 21. 01:09
728x90

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

 

์•„์ด๋“ค์˜ ์ˆ˜์™€ ๋ณด์„ ์ƒ‰์ƒ์˜ ์ˆ˜, ๋ณด์„์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๋ชจ๋“  ๋ณด์„์„ ๋‚˜๋ˆ„์–ด์ค„ ๋•Œ ์ตœ๋Œ€ํ•œ ์ฐจ์ด๊ฐ€ ๋‚˜์ง€ ์•Š๊ฒŒ ๋‚˜๋ˆ„์–ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ํ•œ ์•„์ด๊ฐ€ ๊ฐ–๋Š” ๋ณด์„์˜ ์ˆ˜๋ฅผ ์งˆํˆฌ์‹ฌ์ด๋ผ ํ‘œํ˜„ํ–ˆ๋‹ค.

์ด ๋•Œ ํ•œ ์•„์ด๋Š” ๊ฐ™์€ ๋ณด์„์˜ ์ƒ‰์ƒ๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ๋˜ํ•œ, ๋ณด์„์„ ๋ชป๋ฐ›๋Š” ์•„์ด๋Š” ์žˆ์–ด๋„ ๋‚จ๋Š” ๋ณด์„์€ ์—†์–ด์•ผ ํ•œ๋‹ค.

 

[์ž…๋ ฅ]

์ฒซ์งธ ์ค„์— ์•„์ด๋“ค์˜ ์ˆ˜ N๊ณผ ์ƒ‰์ƒ์˜ ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 109, 1 ≤ M ≤ 300,000, M ≤ N)

๋‹ค์Œ M๊ฐœ ์ค„์—๋Š” ๊ตฌ๊ฐ„ [1, 10^9]์— ํฌํ•จ๋˜๋Š” ์–‘์˜ ์ •์ˆ˜๊ฐ€ ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. K๋ฒˆ์งธ ์ค„์— ์ฃผ์–ด์ง€๋Š” ์ˆซ์ž๋Š” K๋ฒˆ ์ƒ‰์ƒ ๋ณด์„์˜ ๊ฐœ์ˆ˜์ด๋‹ค.

[์ถœ๋ ฅ]

์ฒซ์งธ ์ค„์— ์งˆํˆฌ์‹ฌ์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

[ํ’€์ด]

ํ•˜๋‚˜์˜ ๋ณด์„์˜ ์ˆ˜๊ฐ€ ์ตœ๋Œ€ 10^9 ๊ฐ€ ์ฃผ์–ด์ง€๋ฏ€๋กœ ๋‹จ์ˆœ ์™„์ „ํƒ์ƒ‰์œผ๋กœ๋Š” ํ’€ ์ˆ˜ ์—†๋‹ค.

์ด๋ ‡๊ฒŒ ํฐ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๊ณ  ์ตœ์†Œ์˜ ๊ฒฝ์šฐ๋ฅผ ์ฐพ๋Š” ๊ฒฝ์šฐ์— '์ด๋ถ„ํƒ์ƒ‰' ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•œ๋‹ค.

 

์ด ๋ฌธ์ œ์—์„œ ์ด๋ถ„ํƒ์ƒ‰์„ ์ ์šฉํ•˜๋Š” ๋ฒ•์€ ์งˆํˆฌ์‹ฌ์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์ˆ˜์™€ ์ตœ๋Œ€์ˆ˜๋ฅผ ํ•œ์ •ํ•˜๊ณ  ์ค‘๊ฐ„๊ฐ’๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋ฉฐ ์ตœ์†Œ ์งˆํˆฌ์‹ฌ์„ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค.

 

์˜ˆ์ œ 1์„ ๋ด๋ณด์ž.

5 2
7
4

์•„์ด๋“ค์˜ ์ˆ˜: 5, ๋ณด์„ ์ƒ‰๊น” 2

๋ณด์„ ์ƒ‰๊น” 1์˜ ๊ฐœ์ˆ˜: 7

๋ณด์„ ์ƒ‰๊น” 2์˜ ๊ฐœ์ˆ˜: 4

 

์ด ๋•Œ, ์ตœ์†Œ ์งˆํˆฌ์‹ฌ์€ 1, ์ตœ๋Œ€ ์งˆํˆฌ์‹ฌ์€ 7์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ตœ๋Œ€ ์งˆํˆฌ์‹ฌ์ด 7์ธ ์ด์œ ๋Š” ํ•œ ์•„์ด๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ™์€ ์ƒ‰๊น”์˜ ๋ณด์„๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•œ ์•„์ด๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ณด์„์˜ ๊ฐœ์ˆ˜๋Š” ๋ณด์„ ์ƒ‰๊น”1์˜ 7์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋”ฐ๋ผ์„œ 1 ~ 7์„ ์ด๋ถ„ํƒ์ƒ‰ํ•˜๋ฉฐ ์ตœ์†Œ ์งˆํˆฌ์‹ฌ์„ ์ฐพ๋Š”๋‹ค.

(์ฐธ๊ณ ๋กœ ์ด๋ถ„ํƒ์ƒ‰์€ ์ค‘๊ฐ„๊ฐ’๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๊ณ  ์ •๋‹ต์ด ์ค‘๊ฐ„๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์— ์žˆ๋Š”์ง€, ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š”์ง€ Up & Down ๊ฒŒ์ž„์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 1~7์˜ ์ค‘๊ฐ„๊ฐ’์€ '(์ตœ์†Œ๊ฐ’ + ์ตœ๋Œ€๊ฐ’) / 2' ์ˆ˜ํ•™ ๊ณต์‹์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.)

 

1) ์งˆํˆฌ์‹ฌ์„ 4 ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋ณด์„์„ ๋‚˜๋ˆ ๋ณด์ž. (1+7) / 2 = 4

3๋ช…์—๊ฒŒ ๋‚˜๋ˆ ์ค„ ์ˆ˜ ์žˆ๋‹ค. 5๋ช…๋ณด๋‹ค ์ ์œผ๋ฏ€๋กœ ๋” ์„ธ์„ธํ•˜๊ฒŒ ์ชผ๊ฐค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋” ์ž‘์€ ์งˆํˆฌ์‹ฌ ์ง€์ˆ˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์ตœ๋Œ€๊ฐ’์„ '์ค‘๊ฐ„๊ฐ’ -1' ๋กœ ๊ฐฑ์‹ ํ•˜๊ณ  ๋‹ค์‹œ ์ฐพ์•„๋ณด์ž.

 

2) ์ตœ์†Œ๊ฐ’ 2, ์ตœ๋Œ€๊ฐ’ 3 => ์ค‘๊ฐ„๊ฐ’ 2(์งˆํˆฌ์‹ฌ์„ 2) ๋กœ ๋‘๊ณ  ๋ณด์„์„ ๋‚˜๋ˆ ๋ณด์ž.

5๊ฐœ ์ด์ƒ์œผ๋กœ ์ชผ๊ฐœ์ง€๋ฏ€๋กœ '๋ณด์„ ๋‚˜๋ˆ„๊ธฐ > ์•„์ด๋“ค ์ˆ˜' ๊ฐ€ ๋˜๋ฏ€๋กœ ๋ณด์„์ด ๋‚จ์•„์„œ ์•ˆ๋œ๋‹ค. ๋” ํฐ ๊ฐ’์œผ๋กœ ๋‚˜๋ˆ ์•ผ ํ•˜๋ฏ€๋กœ ์ตœ์†Œ๊ฐ’์„ '์ค‘๊ฐ„๊ฐ’ +1' ๋กœ ๊ฐฑ์‹ ํ•˜๊ณ  ํƒ์ƒ‰ํ•ด๋ณด์ž.

 

3) ์ตœ์†Œ๊ฐ’ 2, ์ตœ๋Œ€๊ฐ’ 3 => ์ค‘๊ฐ„๊ฐ’ 2(์งˆํˆฌ์‹ฌ์„ 2) ๋กœ ๋‘๊ณ  ๋ณด์„์„ ๋‚˜๋ˆ ๋ณด์ž.

2๋ฒˆ๊ณผ ๋™์ผํ•œ ๊ฒฝ์šฐ์ด๋ฏ€๋กœ ์ตœ์†Œ๊ฐ’ = ์ค‘๊ฐ„๊ฐ’ + 1 ๋กœ ๊ฐฑ์‹ ํ•˜๊ณ  ๋‹ค์‹œ ํƒ์ƒ‰ํ•ด๋ณด์ž.

 

4) ์ตœ์†Œ๊ฐ’ 3, ์ตœ๋Œ€๊ฐ’ 3 => ์ค‘๊ฐ„๊ฐ’ 3 (์งˆํˆฌ์‹ฌ 3)

5๋ช…์—๊ฒŒ ๋‚˜๋ˆ ์ค„ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ '์ตœ์†Œ๊ฐ’ = ์ตœ๋Œ€๊ฐ’' ์ด๋ฏ€๋กœ ๋”์ด์ƒ ์ด๋ถ„ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ์†Œ ์งˆํˆฌ์‹ฌ ์ง€์ˆ˜๋Š” 3์ด๋‹ค.

 

์ด๋ ‡๊ฒŒ ์งˆํˆฌ์‹ฌ ๊ฐ’์„ ์ค‘๊ฐ„๊ฐ’์œผ๋กœ ์ •ํ•ด๋‘๊ณ  Up & Down ํ•˜๋ฉฐ ์ตœ์†Œ ์งˆํˆฌ์‹ฌ์„ ์ฐพ์œผ๋ฉด ๋œ๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(logN) !

 

 

[์ฝ”๋“œ]

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int childrenNum, colorNum, input;
int minNum = 1, maxNum = 0;
vector<int> colors;

int GetJealousy();

int main() {

	cin >> childrenNum >> colorNum;
	for (int i = 0; i < colorNum; i++) {
		cin >> input;
		colors.push_back(input);
		maxNum = max(maxNum, input);
	}

	cout << GetJealousy() << "\n";

	return 0;
}

int GetJealousy() {
	int jealousy = 0;

	while (minNum <= maxNum) {
		int mid = (minNum + maxNum) / 2;
		int divideNum = 0;

		for (int color : colors) {
			if (color % mid) divideNum += (color / mid) + 1;
			else divideNum += (color / mid);
		}

		if (divideNum <= childrenNum) {
			jealousy = mid;
			maxNum = mid - 1;
		}
		else minNum = mid + 1;
	}
	return jealousy;
}
728x90