๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽฏPS - Baekjoon, etc/๊ทธ๋ฆฌ๋””

๐Ÿฅ‡[๋ฐฑ์ค€, 2878] ์บ”๋””์บ”๋”” (Java)

by hyeon-z 2023. 4. 3.

 

๋ฌธ์ œ ๋งํฌ

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

 

2878๋ฒˆ: ์บ”๋””์บ”๋””

์ฒซ์งธ ์ค„์— M(1 ≤ M ≤ 2×109)์™€ N(1 ≤ N ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ์นœ๊ตฌ๋“ค์ด ๋ฐ›๊ณ  ์‹ถ์–ดํ•˜๋Š” ์‚ฌํƒ•์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด ๊ฐœ์ˆ˜๋Š” 2×109๋ณด๋‹ค ์ž‘์œผ๋ฉฐ, ์นœ๊ตฌ๋“ค์ด ๋ฐ›๊ณ  ์‹ถ์–ดํ•˜๋Š”

www.acmicpc.net

 

๋‚œ์ด๋„

 

์‹œ๊ฐ„์ œํ•œ

1์ดˆ

 

๋ฌธ์ œ

์˜ค๋Š˜ ์‚ฌํƒ• M๊ฐœ๋ฅผ ๊ฐ€๋“ ๋‹ด์€ ๋ฐ•์Šค๊ฐ€ ํƒ๋ฐฐ๋กœ ํƒํฌ๋„ค ์ง‘์— ๋„์ฐฉํ–ˆ๋‹ค. ํƒํฌ๋Š” ์ด ์‚ฌํƒ•์„ N๋ช…์˜ ์นœ๊ตฌ๋“ค์—๊ฒŒ ๋‚˜๋ˆ„์–ด ์ฃผ๋ ค๊ณ  ํ•œ๋‹ค.
ํƒํฌ์˜ ์นœ๊ตฌ๋“ค์€ ๋ฌธ์ž๋กœ ์‚ฌํƒ•์„ ๋ช‡ ๊ฐœ ๋ฐ›๊ณ  ์‹ถ์€์ง€ ๋ณด๋ƒˆ๋‹ค. ๋งŒ์•ฝ ๋ฐ›๊ณ  ์‹ถ์€ ๊ฐœ์ˆ˜๋งŒํผ ์‚ฌํƒ•์„ ๋ฐ›์ง€ ๋ชปํ•œ๋‹ค๋ฉด, ๊ทธ ์นœ๊ตฌ๋Š” ๋ถ„๋…ธํ•˜๊ฒŒ ๋˜๊ณ , ๋ชป ๋ฐ›๋Š” ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ๋”์šฑ ๋ถ„๋…ธํ•˜๊ฒŒ ๋œ๋‹ค.
๋†€๋ž๊ฒŒ๋„ ํƒํฌ๋Š” ์นœ๊ตฌ๋“ค์˜ ๋ถ„๋…ธ๋ฅผ ์ˆ˜์น˜ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์€ ๋ชป ๋ฐ›๋Š” ์‚ฌํƒ• ๊ฐœ์ˆ˜์˜ ์ œ๊ณฑ์ด๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ํƒํฌ์˜ ์นœ๊ตฌ ๋ฐฑ์ค€์ด๊ฐ€ ๋ฐ›๊ณ  ์‹ถ์€ ์‚ฌํƒ•์˜ ๊ฐœ์ˆ˜๊ฐ€ 32๊ฐœ์˜€์„ ๋•Œ, ์‚ฌํƒ•์„ 29๊ฐœ ๋ฐ›์•„ 3๊ฐœ๋ฅผ ๋ฐ›์ง€ ๋ชปํ•œ๋‹ค๋ฉด, ๊ทธ์˜ ๋ถ„๋…ธ๋Š” 3์˜ ์ œ๊ณฑ 9๊ฐ€ ๋œ๋‹ค.
ํƒํฌ๊ฐ€ ๋ฐ›์€ ์‚ฌํƒ•์˜ ๊ฐœ์ˆ˜์™€ ์นœ๊ตฌ์˜ ์ˆ˜, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์นœ๊ตฌ๋“ค์ด ๋ฐ›๊ณ  ์‹ถ์–ด ํ•˜๋Š” ์‚ฌํƒ•์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์‚ฌํƒ•์„ ์ ์ ˆํžˆ ๋‚˜๋ˆ„์–ด ์ฃผ์–ด ์นœ๊ตฌ๋“ค์˜ ๋ถ„๋…ธ์˜ ํ•ฉ์„ ์ตœ์†Œํ™”ํ•ด ๊ทธ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— M(1 ≤ M ≤ 2 ×10^9)์™€ N(1 ≤ N ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ์นœ๊ตฌ๋“ค์ด ๋ฐ›๊ณ  ์‹ถ์–ด ํ•˜๋Š” ์‚ฌํƒ•์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด ๊ฐœ์ˆ˜๋Š” 2 ×10^9๋ณด๋‹ค ์ž‘์œผ๋ฉฐ, ์นœ๊ตฌ๋“ค์ด ๋ฐ›๊ณ  ์‹ถ์–ด ํ•˜๋Š” ์‚ฌํƒ•์˜ ๊ฐœ์ˆ˜์˜ ํ•ฉ์€ ํ•ญ์ƒ M์„ ๋„˜๋Š”๋‹ค.

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ํƒํฌ ์นœ๊ตฌ๋“ค์˜ ๋ถ„๋…ธ์˜ ํ•ฉ์˜ ์ตœ์†Ÿ๊ฐ’์„ 2^64๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ 1

์ž…๋ ฅ

5 3
1
3
2

 

์ถœ๋ ฅ

1

 

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ 2

์ž…๋ ฅ

10 4
4
5
2
3

 

์ถœ๋ ฅ

4

๋ฌธ์ œ ํ’€์ด ๊ณผ์ •

์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ ์ดํ•ดํ•˜๊ธฐ

 

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ 2๋ฅผ ์‚ดํŽด๋ณด์ž.

์ด 10๊ฐœ์˜ ์‚ฌํƒ•์ด ์กด์žฌํ•˜๊ณ  ์ด๊ฒƒ์„ 4๋ช…์˜ ์นœ๊ตฌ์—๊ฒŒ ๋‚˜๋ˆ„์–ด์ค˜์•ผ ํ•œ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์นœ๊ตฌ์—๊ฒŒ ๋ช‡ ๊ฐœ์”ฉ ๋‚˜๋ˆ ์ฃผ๋ฉด ๋ถ„๋…ธ๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋ ์ง€๋ฅผ ์ƒ๊ฐํ•˜๊ธฐ๋Š” ๋งค์šฐ ์–ด๋ ต๋‹ค.

๊ทธ ๋Œ€์‹  ๋ชป ๋ฐ›์„ ์‚ฌํƒ•์„ ๋ถ„๋ฐฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ณด์ž.

 

์ด 10๊ฐœ์˜ ์‚ฌํƒ•์ด ์กด์žฌํ•˜๊ณ  4๋ช…์˜ ์นœ๊ตฌ๊ฐ€ ๋ฐ›๊ณ  ์‹ถ์–ด ํ•˜๋Š” ์‚ฌํƒ•์˜ ๊ฐœ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

4 5 2 3

์ฆ‰, ์นœ๊ตฌ๋“ค์˜ ๋ถ„๋…ธ๋ฅผ ์‚ฌ์ง€ ์•Š์œผ๋ ค๋ฉด ์ด 14๊ฐœ์˜ ์‚ฌํƒ•์ด ํ•„์š”ํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ์œ„์—์„œ ๋งํ–ˆ๋“ฏ ๋‚˜๋ˆ ์ค„ ์ˆ˜ ์žˆ๋Š” ์‚ฌํƒ•์€ 10๊ฐœ๋ฟ์ด๋‹ค..๐Ÿฅฒ

 

๋”ฐ๋ผ์„œ ๊ฒฐ๊ตญ ์นœ๊ตฌ๋“ค์€ ์ด 4๊ฐœ์˜ ์‚ฌํƒ•์„ ๋ฐ›์ง€ ๋ชปํ•˜๊ฒŒ ๋˜๊ณ  ๊ทธ๊ฒƒ์€ ๋ถ„๋…ธ๊ฐ€ ๋œ๋‹ค.

โ“4๋ช…์˜ ์นœ๊ตฌ๋“ค์—๊ฒŒ ๋ฐ›์ง€ ๋ชปํ•  4๊ฐœ์˜ ์‚ฌํƒ•์„ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฐฐํ•ด์•ผ ๋ถ„๋…ธ์˜ ํ•ฉ์ด ์ตœ์†Œ๊ฐ€ ๋ ๊นŒ?

 

4๋ช…์—๊ฒŒ 1๊ฐœ์”ฉ ๋ถ„๋ฐฐํ•˜๋ฉด ๋ถ„๋…ธ์˜ ํ•ฉ์ด ์ด 4๋กœ ์ตœ์†Œ๊ฐ€ ๋œ๋‹ค.

๋ฐ›์ง€ ๋ชปํ•  ์‚ฌํƒ•์„ ์ตœ๋Œ€ํ•œ ๊ท ๋“ฑํ•˜๊ฒŒ ์นœ๊ตฌ๋“ค์—๊ฒŒ ๋ฐฐ๋ถ„ํ•˜๋ฉด, ๊ทธ๊ฒƒ์ด ๋ถ„๋…ธ์˜ ํ•ฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค!

 

์ž…๋ ฅ๊ฐ’ ์ €์žฅํ•˜๊ธฐ

 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());

int M = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
int[] friends = new int[N];


for (int i = 0; i < N; i++) {
    friends[i] = Integer.parseInt(br.readLine());
}

์นœ๊ตฌ๋“ค์˜ ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉฐ friends๋ฐฐ์—ด์— ๊ฐ ์นœ๊ตฌ๊ฐ€ ๋ฐ›๊ณ  ์‹ถ์–ด ํ•˜๋Š” ์‚ฌํƒ•์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.

 

๋ฐ›์ง€ ๋ชปํ•  ์‚ฌํƒ•์„ ๊ท ๋“ฑํ•˜๊ฒŒ ๋‚˜๋ˆ ์ฃผ๋Š” ์ฝ”๋“œ ๊ตฌํ˜„ํ•˜๊ธฐ

 

์ƒˆ๋กœ์šด ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ์‚ดํŽด๋ณด์ž.

1 5 4 3

์นœ๊ตฌ๋“ค์ด ๋ฐ›๊ณ  ์‹ถ์–ด ํ•˜๋Š” ์‚ฌํƒ•์˜ ์ดํ•ฉ์€ 13์ด๊ณ  ์นœ๊ตฌ๋Š” 4๋ช…์ด๋‹ค.

์ด 11๊ฐœ์˜ ์‚ฌํƒ•์„ ์นœ๊ตฌ๋“ค์€ ๋ฐ›์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

 

์œ„์—์„œ ๋งํ–ˆ๋“ฏ ์ด๋ฅผ 4๋ช…์˜ ์นœ๊ตฌ์—๊ฒŒ ๊ท ๋“ฑํ•˜๊ฒŒ ๋‚˜๋ˆ„๋ฉด 11 / 4 = 2.75์ด๋ฏ€๋กœ ์šฐ์„  ๊ฐ๊ฐ 2๊ฐœ์”ฉ ๋ถ„๋ฐฐํ•ด ๋ณด์ž.

 

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

โ“1๊ฐœ์˜ ์‚ฌํƒ•์„ ๋ฐ›๊ณ  ์‹ถ์–ด ํ•˜๋Š” ์นœ๊ตฌ์—๊ฒŒ 2๊ฐœ์˜ ์‚ฌํƒ•์„ ๋ฐ›์ง€ ๋ชปํ•˜๊ฒŒ ๋ถ„๋ฐฐํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋”ฐ๋ผ์„œ ๋ฐฐ์—ด์˜ ์ •๋ ฌ์ด ํ•„์š”ํ•˜๋‹ค.

1 3 4 5

 

1๋‹จ๊ณ„

์ฒซ ๋ฒˆ์งธ ์นœ๊ตฌ์—๊ฒŒ๋Š” ๋ถ„๋ฐฐํ•œ ๋ฐ›์ง€ ๋ชปํ•  ์‚ฌํƒ•์˜ ์ˆ˜(2), ๋ฐ›๊ณ  ์‹ถ์–ดํ•˜๋Š” ์‚ฌํƒ•์˜ ์ˆ˜(1)์ค‘ ๋” ์ž‘์€ ๊ฐ’์ด 1์ด๋ฏ€๋กœ 1๊ฐœ๋ฅผ ๋ฐ›์ง€ ๋ชปํ•˜๋„๋ก ํ•œ๋‹ค.

๊ทธ ์ด์œ ๋Š” ๋ณธ์ธ์ด ์›ํ•˜๋Š” ์‚ฌํƒ•์˜ ์ˆ˜๋ณด๋‹ค ๋” ๋งŽ์ด ๋ฐ›์ง€ ๋ชปํ•  ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

2๋‹จ๊ณ„

๋‚˜๋จธ์ง€ ์‚ฌํƒ•์€ 11๊ฐœ์—์„œ 1๊ฐœ๋ฅผ ๋บ€ 10๊ฐœ๊ฐ€ ๋œ๋‹ค.

์ด์ œ ์ด 3๋ช…์—๊ฒŒ 10๊ฐœ์˜ ์‚ฌํƒ•์„ ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„๋ฐฐํ•ด์•ผ ํ•œ๋‹ค.

3 4 5

๊ท ๋“ฑํ•˜๊ฒŒ ๋‚˜๋ˆ„๋ฉด 10 / 3 = 3.3.. ์ด๋ฏ€๋กœ ๊ฐ๊ฐ 3๊ฐœ์”ฉ ๋ถ„๋ฐฐํ•œ๋‹ค.

๋‘ ๋ฒˆ์งธ ์นœ๊ตฌ๋Š” ๋ถ„๋ฐฐํ•œ ์‚ฌํƒ•์˜ ์ˆ˜์™€ ๋ฐ›๊ณ  ์‹ถ์–ด ํ•˜๋Š” ์‚ฌํƒ•์˜ ์ˆ˜๊ฐ€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— 3๊ฐœ๋ฅผ ๋ถ„๋ฐฐํ•œ๋‹ค.

 

3๋‹จ๊ณ„

๋‚˜๋จธ์ง€ ์‚ฌํƒ•์€ 10๊ฐœ์—์„œ 3๊ฐœ๋ฅผ ๋บ€ 7๊ฐœ์ด๋‹ค.

์ด์ œ ์ด 2๋ช…์—๊ฒŒ 7๊ฐœ์˜ ์‚ฌํƒ•์„ ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„๋ฐฐํ•ด์•ผ ํ•œ๋‹ค.

4 5

๊ท ๋“ฑํ•˜๊ฒŒ ๋‚˜๋ˆ„๋ฉด 7 / 2 = 3.5์ด๋ฏ€๋กœ ๊ฐ๊ฐ 3๊ฐœ์”ฉ ๋ถ„๋ฐฐํ•œ๋‹ค.

์„ธ ๋ฒˆ์งธ ์นœ๊ตฌ๋Š” ๋ถ„๋ฐฐํ•œ ์‚ฌํƒ•์˜ ์ˆ˜๋ณด๋‹ค ๋ฐ›๊ณ  ์‹ถ์–ดํ•˜๋Š” ์‚ฌํƒ•์˜ ์ˆ˜๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์— 3๊ฐœ๋ฅผ ๋ถ„๋ฐฐํ•œ๋‹ค.

 

4๋‹จ๊ณ„

๋‚˜๋จธ์ง€ ์‚ฌํƒ•์€ 7๊ฐœ์—์„œ 3๊ฐœ๋ฅผ ๋บ€ 4๊ฐœ์ด๋‹ค.

์ด 1๋ช…์—๊ฒŒ 4๊ฐœ์˜ ์‚ฌํƒ•์„ ๋ถ„๋ฐฐํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋งˆ์ง€๋ง‰ ์นœ๊ตฌ์—๊ฒŒ 4๊ฐœ๋ฅผ ๋ถ„๋ฐฐํ•œ๋‹ค.

 

์ด๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Arrays.sort(friends);

long count = sum - M;
long anger = 0;

// ์ตœ๋Œ€ํ•œ ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„๋ฐฐ
for (long friend : friends) {
    long candy = Math.min(friend, count / N--);
    anger += candy * candy;
    count -= candy;
}

System.out.println(anger % (long) Math.pow(2, 64));

 

Math.pow๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด doubleํ˜•์„ return ํ•˜๋ฏ€๋กœ ์•ž์— (long)์œผ๋กœ ํƒ€์ž…์„ ์ง€์ •ํ•˜์—ฌ ์ตœ์ข… ๋ถ„๋…ธ์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

์ฃผ์˜ํ•ด์•ผ ํ•  ์ !!

๋ถ„๋ช… ๋งž๊ฒŒ ํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ ํ‹€๋ ธ๋‹ค๊ณ  ๋‚˜์˜จ๋‹ค๋ฉด ์ž๋ฃŒํ˜•์„ ์˜์‹ฌํ•ด ๋ณด์ž.

 

M์˜ ๋ฒ”์œ„๋Š” 1 ์ด์ƒ 2 * 10^9 ์ดํ•˜์ธ ๊ฐ’์ด๋‹ค.

int ์ž๋ฃŒํ˜•์˜ ๋ฒ”์œ„๋Š” -2^31 ~ 2^31-1, ์ฆ‰ 2^10์„ 10^3์œผ๋กœ ์น˜ํ™˜ํ•˜๋ฉด ๋Œ€๋žต ~ 2 ^ 10^9์˜ ๋ฒ”์œ„๊ฐ€ ๋œ๋‹ค.

 

๋”ฐ๋ผ์„œ N๋งŒ intํ˜•์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋‚˜๋จธ์ง€์˜ ๊ฐ’๋“ค์€ longํ˜•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

์ตœ์ข… ์ฝ”๋“œ

 

public class BOJ_2878 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        long M = Integer.parseInt(st.nextToken());
        int N = Integer.parseInt(st.nextToken());
        long[] friends = new long[N];
        long sum = 0;

        for (int i = 0; i < N; i++) {
            friends[i] = Integer.parseInt(br.readLine());
            sum += friends[i];
        }

        Arrays.sort(friends);

        long count = sum - M;
        long anger = 0;

        // ์ตœ๋Œ€ํ•œ ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„๋ฐฐ
        for (long friend : friends) {
            long candy = Math.min(friend, count / N--);
            anger += candy * candy;
            count -= candy;
        }

        System.out.println(anger % (long) Math.pow(2, 64));
    }
}

 

 

๋Œ“๊ธ€