J

[JAVA] BOJ ๋ฐฑ์ค€ 1943 ๋™์ „ ๋ถ„๋ฐฐ ๋ณธ๋ฌธ

๐Ÿ”‘ Problem Solving/๐Ÿ‡ BOJ

[JAVA] BOJ ๋ฐฑ์ค€ 1943 ๋™์ „ ๋ถ„๋ฐฐ

snowball๐Ÿฐ 2023. 2. 24. 09:50

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

 

1943๋ฒˆ: ๋™์ „ ๋ถ„๋ฐฐ

์„ธ ๊ฐœ์˜ ์ž…๋ ฅ์ด ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ž…๋ ฅ์˜ ์ฒซ์งธ ์ค„์— ๋™์ „์˜ ์ข…๋ฅ˜ N(1 ≤ N ≤ 100)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ž…๋ ฅ์˜ ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N+1์งธ ์ค„๊นŒ์ง€ ๊ฐ๊ฐ์˜ ๋™์ „์˜ ๊ธˆ์•ก๊ณผ ๊ฐœ์ˆ˜๊ฐ€ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ๋‹จ, ์›

www.acmicpc.net

๋ฌธ์ œ

์œคํ™”์™€ ์ค€ํฌ๋Š” ์†”์„ ์ˆ˜๋ฒ”ํ•˜์—ฌ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ค๋Š” ์ฐฉํ•œ ์ผ์„ ํ•˜์˜€๋‹ค. ์›์žฅ์„ ์ƒ๋‹˜๊ป˜์„œ๋Š” ์œคํ™”์™€ ์ค€ํฌ๋ฅผ ์นญ์ฐฌํ•˜์‹œ๊ณ  ๊ณผ์ž๋‚˜ ์‚ฌ ๋จน์œผ๋ผ๊ณ  ํ•˜์‹œ๋ฉฐ ๋™์ „ ๋ช‡ ๊ฐœ๋ฅผ ์œคํ™”์™€ ์ค€ํฌ์—๊ฒŒ ๊ฑด๋„ค ์ฃผ์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ˆ์„ ๋ฐ›์€ ์œคํ™”์™€ ์ค€ํฌ๋Š” ์ข‹์•„ํ•˜๊ธฐ๋ณด๋‹ค ๊ณ ๋ฏผ์— ๋น ์ง€๊ณ  ๋ง์•˜๋‹ค. ์›์žฅ์„ ์ƒ๋‹˜๊ป˜ ๋ฐ›์€ ์ด ๋ˆ์„ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ„์–ด ํ• ์ง€ ๊ณ ๋ฏผ์— ๋น ์ง„ ๊ฒƒ์ด๋‹ค. ๋‘ ์‚ฌ๋žŒ ๋ชจ๋‘ ์ƒ๋Œ€๋ฐฉ์ด ์ž๊ธฐ๋ณด๋‹ค 1์›์ด๋ผ๋„ ๋” ๋ฐ›๋Š” ๊ฒƒ์€ ๋„์ €ํžˆ ์ธ์ •ํ•  ์ˆ˜ ์—†์–ด ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ˆ์„ ๋˜‘๊ฐ™์ด ๋‘˜๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ€์ ธ์•ผ ๋‘ ์‚ฌ๋žŒ์ด ๋ชจ๋‘ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ๋‘ ์‚ฌ๋žŒ์—๊ฒŒ ๋ˆ์„ ๋˜‘๊ฐ™์ด ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 500์›์งœ๋ฆฌ 1๊ฐœ์™€ 50์›์งœ๋ฆฌ 1๊ฐœ๋ฅผ ๋ฐ›์•˜๋‹ค๋ฉด, ์ด ๋ˆ์„ ๋‘ ์‚ฌ๋žŒ์ด ๋˜‘๊ฐ™์ด ๋‚˜๋ˆ„์–ด ๊ฐ€์งˆ ์ˆ˜๋Š” ์—†๋‹ค. ๋ฌผ๋ก  ๋™์ „์„ ๋ฐ˜์œผ๋กœ ์ž˜๋ผ์„œ ๋‚˜๋ˆ„์–ด ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ ๊ทธ๋Ÿฌ๋ฉด ๋ˆ์œผ๋กœ์„œ์˜ ๊ฐ€์น˜๋ฅผ ์žƒ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜๋Š” ์—†๋‹ค.

์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์›์žฅ ์„ ์ƒ๋‹˜๊ป˜์„œ N๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋™์ „์„ ๊ฐ๊ฐ ๋ช‡ ๊ฐœ์”ฉ ์ฃผ์…จ์„ ๋•Œ, ๊ทธ ๋ˆ์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ž…๋ ฅ

์„ธ ๊ฐœ์˜ ์ž…๋ ฅ์ด ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ž…๋ ฅ์˜ ์ฒซ์งธ ์ค„์— ๋™์ „์˜ ์ข…๋ฅ˜ N(1 ≤ N ≤ 100)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ž…๋ ฅ์˜ ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N+1์งธ ์ค„๊นŒ์ง€ ๊ฐ๊ฐ์˜ ๋™์ „์˜ ๊ธˆ์•ก๊ณผ ๊ฐœ์ˆ˜๊ฐ€ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ๋‹จ, ์›์žฅ์„ ์ƒ๋‹˜๊ป˜์„œ ์ฃผ์‹  ๊ธˆ์•ก์˜ ์ด ํ•ฉ์€ 100,000์›์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. ๋™์ „์˜ ๊ธˆ์•ก๊ณผ ๊ฐœ์ˆ˜๋Š” ์ž์—ฐ์ˆ˜์ด๊ณ , ๊ฐ™์€ ๊ธˆ์•ก์„ ๊ฐ€์ง„ ๋™์ „์ด ๋‘ ๋ฒˆ ์ด์ƒ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„๋ถ€ํ„ฐ ์„ธ ์ค„์— ๊ฑธ์ณ, ๊ฐ ์ž…๋ ฅ์— ๋Œ€ํ•˜์—ฌ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋ฉด 1, ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ’ก ๊ฐœ์„ ์ 
1. sum์ด ํ™€์ˆ˜์ธ ๊ฒฝ์šฐ ์ •ํ™•ํ•˜๊ฒŒ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์—†๋‹ค. ์ด๊ฒƒ์„ dp๋ฅผ ๊ฐฑ์‹ ํ•œ ๋’ค ์ฒดํฌํ•˜๊ฒŒ ๋˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
2. 50000๊นŒ์ง€๋งŒ ๊ฒ€์‚ฌํ•˜์ž! → ์–ด์ฐจํ”ผ ํ•ฉ์€ 100000์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๊ฐ„ ๊ฐ’์€ 50000์„ ๋„˜์ง€ ์•Š๊ณ  ์šฐ๋ฆฌ๋Š” ์ค‘๊ฐ„๊ฐ’์ด ๊ฐ€๋Šฅํ•œ์ง€๋งŒ ๊ฒ€์‚ฌํ•˜๋ฉด ๋œ๋‹ค.
3. ์ด์ฐจ์› DP๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ์ผ์ฐจ์›์„ ์‚ฌ์šฉํ•˜์—ฌ ๋’ค์—์„œ๋ถ€ํ„ฐ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค.
4. int dp๋ง๊ณ  boolean์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ ๊ฐ€์น˜์˜ ๊ฐ’์„ ๋งŒ๋“ค์ˆ˜ ์žˆ๋Š”์ง€๋งŒ ๊ณ ๋ คํ•œ๋‹ค.

์ „์ฒด ์ฝ”๋“œ

import java.util.*;
import java.io.*;

public class BOJ_1943 {
	public static void main(String[] args) throws Exception {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		for(int t=0; t<3; t++) {
			boolean[] d = new boolean[50001];
			ArrayDeque<int[]> coins = new ArrayDeque<>();
			d[0] = true;
			int sum = 0;
			int N = Integer.parseInt(bf.readLine());
			for(int u =0; u<N; u++) {
				StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
				int coin = Integer.parseInt(st.nextToken());
				int num = Integer.parseInt(st.nextToken());
				sum += num * coin;
				for(int k = coin; k<=num*coin && k<=50000; k+=coin) {
					d[k] = true;
				}
				coins.offer(new int[] {coin, num, sum});
			}
			if(sum % 2 == 1) sb.append(0).append("\\n");
			else if(d[sum/2]) sb.append(1).append("\\n");
			else {
				while(!coins.isEmpty()) {
					int[] now = coins.poll();
					if(now[2] > 50000) now[2] = 50000;
					for(int i=0; i<now[1]; i++) {
						for(int j=now[2]; j>now[0]; j--) {
							if((j-now[0]) % now[0] == 0 && (j-now[0]) <= now[0]*now[1]) continue;
							d[j] |= d[j-now[0]];
						}
					}
				}
				if(sum % 2 == 0 && d[sum/2]) sb.append(1).append("\\n");
				else sb.append(0).append("\\n");
			}
		}
		System.out.println(sb);
	}
}

ํ•œ ์ค„ ์”ฉ ์‚ดํŽด๋ณด์ž!

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
for(int t=0; t<3; t++) {
	boolean[] d = new boolean[50001];
	ArrayDeque<int[]> coins = new ArrayDeque<>();
	d[0] = true;
	int sum = 0;
	int N = Integer.parseInt(bf.readLine());

์„ธ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ํ™•์ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ FOR๋ฌธ์„ ์„ธ๋ฒˆ ๋Œ๋ฆฐ๋‹ค.

์‚ฌ์šฉํ•  dp๋ฅผ ์„ ์–ธํ•œ๋‹ค.

ArrayDeque์„ ์ด์šฉํ•˜์—ฌ ๋™์ „์˜ ๊ฐ€์น˜์™€ ๊ฐœ์ˆ˜, ์—ฌํƒœ์˜ ํ•ฉ์„ ๋„ฃ์–ด์ค€๋‹ค.

0์›์€ ์–ธ์ œ๋‚˜ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— true๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

for(int u =0; u<N; u++) {
		StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
		int coin = Integer.parseInt(st.nextToken());
		int num = Integer.parseInt(st.nextToken());
		sum += num * coin;
		for(int k = coin; k<=num*coin && k<=50000; k+=coin) {
			d[k] = true;
		}
		coins.offer(new int[] {coin, num, sum});
	}

์‚ฌ์šฉํ•  ๋™์ „ ์ข…๋ฅ˜ N๊ฐœ๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„์ฃผ๊ณ  coins์— ๋„ฃ์–ด์ค€๋‹ค.

์ด๋•Œ dp๋ฅผ 1์ฐจ ๊ฐฑ์‹ ํ•ด์ฃผ๋Š”๋ฐ ์ž…๋ ฅ๋ฐ›์€ ๋™์ „์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๊ฐ€์น˜๋งŒ! true๋กœ ๋ฐ”๊พธ์–ด์ค€๋‹ค.

50000๊นŒ์ง€๋งŒ ๊ฒ€์‚ฌํ•˜๊ธฐ๋กœ ํ•˜์˜€๊ธฐ์— ์ œํ•œ ์กฐ๊ฑด์„ ๋„ฃ๋Š”๋‹ค.(์žŠ์œผ๋ฉด ArrayIndexOutOfBounds๊ฐ€ ๋‚  ๊ฒƒ์ด๋‹ค.)

if(sum % 2 == 1) sb.append(0).append("\\n");
else if(d[sum/2]) sb.append(1).append("\\n");

sum์ด ํ™€ ์ˆ˜ ์ธ ๊ฒฝ์šฐ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์ด๊ณ  ์—ฌํƒœ์˜ ๊ฐฑ์‹ ์œผ๋กœ ๋งŒ๋“ค์ˆ˜ ์žˆ๋Š” ๊ฐ€๊ฒฉ์ด๋ฉด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์ด๋ฉด 1์„ ์ถœ๋ ฅํ•œ๋‹ค.

else {
		while(!coins.isEmpty()) {
			int[] now = coins.poll();
			if(now[2] > 50000) now[2] = 50000;
			for(int i=0; i<now[1]; i++) {
				for(int j=now[2]; j>now[0]; j--) {
					if((j-now[0]) % now[0] == 0 && (j-now[0]) <= now[0]*now[1]) continue;
					d[j] |= d[j-now[0]];
				}
			}
		}
		if(d[sum/2]) sb.append(1).append("\\n");
		else sb.append(0).append("\\n");
	}
}

coins์— ๋„ฃ์–ด์žˆ๋˜ ๋™์ „๋“ค์„ ๊บผ๋‚ด์„œ dp๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.

๋จผ์ € ๋ฐ›์•„์ค€ sum์ด 50000์ด์ƒ์ด๋ฉด 50000๋ถ€ํ„ฐ๋งŒ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฐ”๊พธ์–ด์ค€๋‹ค. ์ด๋•Œ sum/2์œผ๋กœ ๋ฐ”๊พธ์–ด์ฃผ์–ด๋„ ๋œ๋‹ค.

์ด์ค‘ for๋ฌธ์„ ํ†ตํ•ด ๊ฐ™์€ ์ข…๋ฅ˜์ด ๋™์ „์„ “๊ฐ๊ฐ” ์‚ดํŽด dp๋ฅผ ๊ฐฑ์‹ ํ•  ๊ฒƒ์ด๋‹ค. ์ด๋•Œ 1์ฐจ dp ๊ฐฑ์‹ ๊ณผ ์ค‘๋ณต๋˜์ง€ ๋ง์•„์•ผํ•˜๋ฏ€๋กœ if๋ฌธ์˜ ์กฐ๊ฑด์„ ํ†ตํ•ด ์ œํ•œ์„ ์ค€๋‹ค.

d[j-coin]์˜ ๊ฐ’์ด true์ด๋ฉด d[j]๋„ true๊ฐ€ ๋˜๋„๋ก or๋ฅผ ์ด์šฉํ•ด์ค€๋‹ค.

sum/2๋ฅผ ์‚ดํŽด ์ถœ๋ ฅ์„ ์ •ํ•ด์ค€๋‹ค.

4๊ฐ€์ง€์˜ ๊ฐœ์„ ์„ ํ†ตํ•ด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜๊ณ  ์—๋Ÿฌ๊ฐ€ ๋‚˜๋˜ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค…!

Comments