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

์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[๋ฐฑ์ค€] 5546๋ฒˆ : ํŒŒ์Šคํƒ€ - JAVA[์ž๋ฐ”]

๋ฐ˜์‘ํ˜•
  • Algorithm Problem

  • Solving
  1. ์—ฐ์†์œผ๋กœ 3์ผ์ด ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค. 
  2. ์˜ค๋Š˜์ด ์—ฐ์†๋œ ๋ง› 2์ผ์ฐจ๋ผ๋ฉด, ํ•ด๋‹น ๋ง›์˜ ๊ทธ ์ „๋‚  1์ผ์ฐจ์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜์™€ ๊ฐ™๋‹ค.
  3. ์˜ค๋Š˜์ด ๋ง› 1์ผ์ฐจ๋ผ๋ฉด, ๋‹ค๋ฅธ ๋‘ ๋ง›์˜ 1, 2์ผ์ฐจ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜์˜ ํ•ฉ๊ณผ ๊ฐ™๋‹ค.
  4. ์ˆœํšŒ ๊ฒฝ์šฐ๋Š” ๋งˆ์ง€๋ง‰๋‚  ๊ธฐ์ค€ (3๊ฐ€์ง€ ๋ง›) * (1์ผ์ฐจ ์ธ์ง€, 2์ผ์ฐจ์ธ์ง€)์˜ 6๊ฐ€์ง€์˜ ์ดํ•ฉ์ด๋‹ค.
  5. 1์ผ์ฐจ๋ฅผ ๋ฌด์ž‘์ • 1/0์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์—†๋‹ค. ๊ณ ์ •๋œ 2, 3์ผ์ฐจ๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค.
์˜ˆ์ œ 1
5 3 -- day, ์ง€์ •์ผ์ž
3 1 -- 3์ผ์ฐจ๋Š” 1๋ฒˆ ๋ง›
1 1 -- 1์ผ์ฐจ๋Š” 1๋ฒˆ ๋ง›
4 2 -- 4์ผ์ฐจ๋Š” 2๋ฒˆ ๋ง›
x o x x o -- x : ๊ณ ์ • o : ๋ณ€ํ™”
1 2 1 2 1
1 2 1 2 2 -- ์—ฐ์† 2์ผ์ฐจ์ธ ๊ฒฝ์šฐ
1 2 1 2 3
1 3 1 2 1
1 3 1 2 2 -- ์—ฐ์† 2์ผ์ฐจ์ธ ๊ฒฝ์šฐ
1 3 1 2 3
์˜ˆ์ œ 1 result 
1๋ฒˆ ๋ง› : n/n 0/n 2/0 n/n 2/0 -- 4์ผ์ฐจ๊ฐ€ 2๋กœ ๊ณ ์ •์ด์–ด์„œ ์—ฐ์† 1์ผ์ฐจ๋งŒ 2๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.
2๋ฒˆ ๋ง› : n/n 1/0 n/n 2/0 0/2 -- 4์ผ์ฐจ๊ฐ€ 2๋กœ ๊ณ ์ •์ด์–ด์„œ ์—ฐ์† 2์ผ์ฐจ๋งŒ 2๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.
3๋ฒˆ ๋ง› : n/n 1/0 n/n n/n 2/0 -- 4์ผ์ฐจ๊ฐ€ 2๋กœ ๊ณ ์ •์ด์–ด์„œ ์—ฐ์† 1์ผ์ฐจ๋งŒ 2๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

3์ผ์ด ๊ณ ์ •๋˜์–ด์žˆ์–ด, 2์ผ์ฐจ์™€ 5์ผ์ฐจ์˜ ๊ฒฝ์šฐ๋งŒ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค. ํ•˜๋ฃจ๋กœ ์˜ˆ์ œ๋ฅผ ๋ฐ”๊ฟ”์„œ ์ƒ๊ฐํ•ด๋ณด์ž.

ํ…Œ์ŠคํŠธ ์˜ˆ์ œ
5 1 -- 5์ผ์ค‘ ํ•˜๋ฃจ๋งŒ ์ง€์ •๋œ ๋ง›, 2์ผ์ฐจ๋งŒ 1๋ฒˆ ๋ง›
2 1
ํ…Œ์ŠคํŠธ ์˜ˆ์ œ result : 60
--------์ง€์ •--------------
1 : n/n 2/1 0/2 6/0 16/6 
2 : n/n n/n 3/0 5/3 14/5 
3 : n/n n/n 3/0 5/3 14/5 

1์ผ์ฐจ๋Š” 2์ผ์ฐจ๊ฐ€ 1๋ฒˆ๋ง›์œผ๋กœ ์ •ํ•ด์ ธ ์žˆ๊ณ , 3์ผ์ฐจ๋Š” ์•ˆ์ •ํ•ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, 1์ผ์ฐจ๋Š” ์„ธ๊ฐ€์ง€ ๋ง› ๋ชจ๋‘ 1/0์œผ๋กœ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 1/0์˜ ์˜๋ฏธ๋Š” ํ•ด๋‹น ๋ง›์ด 1์ผ์ฐจ ์กฐ๊ฑด์ธ ๊ฒฝ์šฐ/2์ผ์ฐจ ์กฐ๊ฑด์ธ ๊ฒฝ์šฐ์ด๋‹ค. 3์ผ์ฐจ๊ฐ€ ๊ณ ์ •์ด ์•„๋‹ˆ๊ธฐ๋•Œ๋ฌธ์— 1/0์œผ๋กœ ์ฑ„์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ƒ๊ฐํ•˜์ž.

2์ผ์ฐจ์—์„œ๋Š” 1๋ฒˆ ๋ง›์ด 1์ผ์ฐจ ๊ฒฝ๊ณผ์ธ ์ˆ˜๋Š” ๊ทธ ์ „๋‚  ๋ง›์ด 2๋˜๋Š” 3๋ฒˆ ๋ง›์ธ ๊ฒฝ์šฐ์˜ ํ•ฉ์ด๊ธฐ ๋•Œ๋ฌธ์—, 1+0+1+0 = 2 ์ด๋‹ค. 1๋ฒˆ ๋ง›์ด 2์ผ ์ฐจ์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๊ทธ ์ „๋‚  ๋ง›์ด 1์ผ๋•Œ 1์ผ์ฐจ์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜ 1๊ณผ ๊ฐ™๋‹ค.

3์ผ์ฐจ๋Š” 1๋ฒˆ ๋ง›์ด 1์ผ์ฐจ์ผ ๊ฒฝ์šฐ๋Š” 0์ด๋‹ค. ์ด๋ฏธ ์•ž์„œ 2์ผ์ฐจ๊ฐ€ 1๋ฒˆ๋ง›์œผ๋กœ ์ •ํ•ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. 1๋ฒˆ ๋ง›์ด 2์ผ์ฐจ์ธ ๊ฒฝ์šฐ๋Š” ๊ทธ ์ „๋‚  1๋ฒˆ๋ง›์ด 1์ผ์ฐจ์ธ ๊ฒฝ์šฐ์™€ ๊ฐ™์€ 2์ด๋‹ค. 2๋ฒˆ๋ง›๊ณผ 3๋ฒˆ ๋ง›์€ ๊ฐ๊ฐ 2์ผ์ฐจ ๋ง›์ด 1๋กœ ์ •ํ•ด์ ธ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 2์ผ์ฐจ์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 0 ์ด๊ณ , 1์ผ์ฐจ์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๊ทธ ์ „๋‚  ํ•ด๋‹น ๋ง›์ด ์•„๋‹Œ ๊ฒฝ์šฐ์˜ ์ˆ˜์˜ ์ดํ•ฉ(1๋ฒˆ๋ง› ๊ณ ์ •) 2+1 = 3์ด๋‹ค.

4์ผ์ฐจ๋Š” 1๋ฒˆ ๋ง›์ผ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๊ทธ ์ „๋‚ ์˜ 2, 3๋ฒˆ๋ง› ๊ฒฝ์šฐ์˜ ์ˆ˜์˜ ์ดํ•ฉ 3+0+3+0์ด๊ณ , 2์ผ์ฐจ์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๊ทธ ์ „๋‚ ์˜ 1์ผ์ฐจ์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜ 0 ๊ณผ ๊ฐ™๋‹ค. 2, 3๋ฒˆ ๋ง›์€ ๊ฐ๊ฐ 1์ผ์ฐจ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๊ทธ ์ „๋‚  ํ•ด๋‹น ๋ง›์ด ์•„๋‹Œ ๊ฒฝ์šฐ์˜ ์ˆ˜ 0+2+3+0 = 5 ์ด๊ณ , 2์ผ์ฐจ์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๊ทธ์ „๋‚  1์ผ์ฐจ์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜ 3๊ณผ ๊ฐ™๋‹ค.

5์ผ์ฐจ๋Š” 1๋ฒˆ ๋ง›์˜ ๊ฒฝ์šฐ ๊ทธ ์ „๋‚ ์˜ 2, 3๋ฒˆ ๋ง›์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ดํ•ฉ 5+3+5+3 = 16์ด๊ณ , 2์ผ์ฐจ์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๊ทธ์ „๋‚  1์ผ์ฐจ์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜ 6๊ณผ ๊ฐ™๋‹ค. 2,3๋ฒˆ ๋ง›์€ ๊ฐ๊ฐ 1์ผ์ฐจ์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๊ทธ ์ „๋‚  ํ•ด๋‹น ๋ง›์ด ์•„๋‹Œ ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ดํ•ฉ 6+0+5+3 = 14์ด๊ณ , 2์ผ์ฐจ์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๊ทธ ์ „๋‚ ์ด 1์ผ์ฐจ์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜ 5์™€ ๊ฐ™๋‹ค.

์œ„ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์žฌ๊ท€๋ฌธ์„ ๊ตฌ์„ฑํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

	private static int recur(int cur, int sel, int cnt) {
		if (arr[cur] != -1 && arr[cur] != sel) // cur : ํ˜„์žฌ์ผ์ž, sel : ์„ ํƒ๋œ ๋ง›, cnt : ์ผ์ฐจ
			return 0; // ๋ง›์ด ์ •ํ•ด์ง„ ๋‚ ์งœ์ธ๋ฐ, ํ•ด๋‹น ๋ง›์ด ์•„๋‹Œ๊ฒฝ์šฐ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ๋ณ€ํ™” ์—†์Œ
		if (cur == 1) // N์ผ์ฐจ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ 1์ผ์ฐจ๊นŒ์ง€ ๋‚ด๋ ค์™”์„ ๋•Œ, 
			return cnt == 0 ? 1 : 0; // cnt - 0 : 1์ผ์ฐจ ์ธ ๊ฒฝ์šฐ 1, 1 : 2์ผ์ฐจ์ธ ๊ฒฝ์šฐ๋Š” ๋ถˆ๊ฐ€ 0
		if (dp[cur][sel][cnt] != null)
			return dp[cur][sel][cnt]; // ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฐ’์ด๋ฉด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์œผ๋กœ ๋ฐ˜ํ™˜
		dp[cur][sel][cnt] = 0; // Integer๋กœ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๋ฉด ์ดˆ๊ธฐํ™” ์—†์ด null๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
		int tmp = 0; 
		if (cnt == 0) { // ๋ฐฉ๋ฌธ ํ–ˆ์„ ๋•Œ 1์ผ์ฐจ๋ผ๋ฉด, ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š”
			for (int i = 0; i < 3; i++) { // i๋Š” ์ „๋‚  ์„ ํƒํ•  ๋ง›
				if (i == sel) // ํ˜„์žฌ sel์ด 1์ผ์ฐจ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ „๋‚  ๋ง›์ด ๊ฐ™์„ ์ˆ˜ ์—†๋‹ค.
					continue;
				tmp = (tmp + recur(cur - 1, i, 0) + recur(cur - 1, i, 1)) % MOD;
			} // ํ•ด๋‹น ๋ง›์ด 1์ผ์ฐจ ์ผ๋•Œ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” cur-1 ํ•˜๋ฃจ์ „๋‚  ๋‹ค๋ฅธ ๋ง› ๊ฒฝ์šฐ์˜ ์ˆ˜์˜ ์ดํ•ฉ
		} else
			tmp = recur(cur - 1, sel, 0); // ํ•ด๋‹น ๋ง›์ด 2์ผ์ฐจ๋ฉด ์ „๋‚  1์ผ์ฐจ(0)๊ณผ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๊ฐ™๋‹ค.
		return dp[cur][sel][cnt] = tmp; // ๋ฉ”๋ชจ์ด์ œ์ด์…˜
	}

์ค‘์  ์‚ฌํ•ญ์€ ํ•ด๋‹น๋ง›์ด 3์ผ ์—ฐ์† ๋ถˆ๊ฐ€๋Šฅ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 1,2์ผ์ฐจ ์—ฌ๋ถ€ ์™€ 3๊ฐ€์ง€ ๋ง›์„ ๊ณฑํ•œ ์ด 6๋ฒˆ์˜ ์ˆœํšŒ๋ฅผ ์‹œ์ผœ์•ผ ํ•˜๋ฉฐ, ํ•˜๋ฃจ์”ฉ ๋ฆฌํ”„ํŠธ๋ฆฌ๋กœ ์ด๋™ํ•˜๊ธฐ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ์—†๋‹ค๋ฉด 10ํšŒ๋งŒ ๋ฐ˜๋ณตํ•ด๋„ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚  ๊ฒƒ์ด๋‹ค. 

๋ฐ˜์‘ํ˜•
  • Full Code
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Day81BOJ5546ํŒŒ์Šคํƒ€ {
	static final int MOD = 10_000;
	static int N, K, ans;
	static int[] arr;
	static Integer[][][] dp;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = ip(st.nextToken());
		K = ip(st.nextToken());
		ans = 0;
		arr = new int[N + 1];
		Arrays.fill(arr, -1);
		dp = new Integer[N + 1][3][2];
		for (int i = 0; i < K; i++) {
			st = new StringTokenizer(br.readLine());
			arr[ip(st.nextToken())] = ip(st.nextToken()) - 1;
		}
		for (int i = 0; i < 3; i++) { // ๋ง›
			for (int j = 0; j < 2; j++) { // ์—ฐ์†
				ans += recur(N, i, j);
//				System.out.println("result : " + recur(N, i, j));
//				print(dp);
			}
		}
		System.out.println(ans % MOD);
		br.close();
	}

	private static int recur(int cur, int sel, int cnt) {
		if (arr[cur] != -1 && arr[cur] != sel)
			return 0;
		if (cur == 1)
			return cnt == 0 ? 1 : 0;
		if (dp[cur][sel][cnt] != null)
			return dp[cur][sel][cnt];
		dp[cur][sel][cnt] = 0;
		int tmp = 0;
		if (cnt == 0) {
			for (int i = 0; i < 3; i++) {
				if (i == sel)
					continue;
				tmp = (tmp + recur(cur - 1, i, 0) + recur(cur - 1, i, 1)) % MOD;
			}
		} else
			tmp = recur(cur - 1, sel, 0);
		return dp[cur][sel][cnt] = tmp;
	}

	static int ip(String s) { // ๊ธธ์–ด
		return Integer.parseInt(s);
	}

	private static void print(Integer[][][] a) {
		StringBuilder tt = new StringBuilder();
		for (int j = 0; j < 3; j++) {
			tt.append(j + 1 + " : ");
			for (int i = 1; i < N + 1; i++) {
				String s = "";
				tt.append(s = (a[i][j][0] + "/" + a[i][j][1]).replaceAll("ull", ""))
						.append(s.length() > 2 ? " " : "\t");
			}
			tt.append("\n");
		}
		System.out.println(tt);
	}
}
  • Review

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

 

 

 

 

 

๋ฐ˜์‘ํ˜•

'์•Œ๊ณ ๋ฆฌ์ฆ˜ > ๋ฐฑ์ค€' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ฐฑ์ค€] 17966๋ฒˆ : Graph and Cycles - JAVA[์ž๋ฐ”]  (0) 2022.04.27