์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- ์คํ๋ง
- ํ์ด์ฌ
- ํ๋ฌํฐ
- php
- C์ธ์ด
- SWEA
- ํ์ด์ฝ ์ด๋์ฝ๋
- programmers
- ํ์ ๋ถ๊ธฐ
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ๋ฌธ์ ํ์ด
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ 3ํ
- ์๋ฐ
- ํ์ด์ฝ ์ถ์ฒ์ธ์ฝ๋
- JAVA SPRING
- ๋ฐฑ์ค
- ํ์ด์ฝ ์ถ์ฒ์ธ
- ํ๋ฌํฐ ๊ฐ๋ฐํ๊ฒฝ ์ค์
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์๋ฃจ์
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์์
- ํ์ด์ฝ ์น๊ตฌ์ฝ๋
- Java
- ์๋ฐ ์คํ๋ง
- ์ต๋จ ๊ฒฝ๋ก
- C
- Flutter
- spring
- php ํ๋ก๊ทธ๋๋ฐ
- ๋ฐฐ์ด
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์ฐ์ต๋ฌธ์
- Today
- Total
ImJay
[BOJ/Java] 6902. Orko ๋ณธ๋ฌธ
๐ [BOJ/Java] 6902. Orko
๐ ๋ฌธ์ ๋งํฌ: ๋ฌธ์ ๋ณด๊ธฐ
๐ ๋ฌธ์ ํด์
Dumitru๊ฐ ์ด์ํ ๊ฟ์ ๊พธ๊ฒ ๋๋ค. ๊ฟ ์์์ ๋ฌธ์ด ์ ๊ธด ๋ฐฉ์ ๊ฐํ Dumitru๋ n๊ฐ์ ๋ฐ์ค๋ฅผ ๋ฐ๊ฒฌํ๋ฉฐ, ๊ฐ ๋ฐ์ค์๋ m๊ฐ์ ์ ์๊ฐ ์๋ค. ๊ฐ ์ ์์๋ 1 ์ด์์ ์ ์๊ฐ ์ ํ ์๋ค. ๊ทธ๋ฌ๋ ์ค, ๋ ๊ฐ์ ์ ์ k์ l์ด ์ ํ ์ชฝ์ง๋ฅผ ๋ฐ๊ฒฌํ๊ณ , ์ชฝ์ง์๋ ์๋์ ๊ฐ์ ์์ ์ ํ๋ผ๋ ์ง์๊ฐ ์ ํ ์๋ค.
1๋จ๊ณ: ์ฒซ ๋ฒ์งธ ๋ฐ์ค๋ถํฐ n๋ฒ์งธ ๋ฐ์ค๊น์ง ์์๋๋ก ๊ฐ ๋ฐ์ค์์ ํ ๊ฐ์ ์ ์๋ฅผ ์ ํํ๋ค. ์ ํํ ์ ์์ ์ซ์๋ฅผ ๋ ธํธ์ ๊ธฐ๋กํ ํ, ํด๋น ์ ์์ ์ซ์๋ฅผ 1๋ก ๋ณ๊ฒฝํ๋ค.
2๋จ๊ณ: n-1๋ฒ์งธ ๋ฐ์ค๋ถํฐ ๋ ๋ฒ์งธ ๋ฐ์ค๊น์ง ์ญ์์ผ๋ก ๊ฐ ๋ฐ์ค์์ ํ ๊ฐ์ ์ ์๋ฅผ ์ ํํ๋ค.
๋ชฉํ๋ ๋ ธํธ์ ๊ธฐ๋ก๋ ์ซ์๋ค์ ๊ณฑ์ด k๋ก ๋๋์ด ๋จ์ด์ง๋๋ก ํ๋ ์ ํ ๋ฐฉ๋ฒ์ ์ด ๊ฐ์ง์ T๋ฅผ ๊ตฌํ๊ณ , T๋ฅผ l๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ด๋ค.
๐ ๏ธ ํ์ด ๊ณผ์
๋จผ์ , n, m, k, l๊ณผ ๊ฐ ๋ฐ์ค์ ์ ์ ๊ฐ๋ค์ ์ ๋ ฅ๋ฐ๋๋ค. ๋ฌธ์ ์ ํต์ฌ์ k์ ์ฝ์๋ฅผ ์ํ๋ก ํ์ฉํ๋ ๊ฒ์ด๋ค. k์ ๋ชจ๋ ์ฝ์๋ฅผ ๊ตฌํ ๋ค, ๊ฐ ์ฝ์์ ์ธ๋ฑ์ค๋ฅผ ๋งคํํ์ฌ ์ํ ์ ์ด ํ ์ด๋ธ์ ๊ตฌ์ฑํ๋ค.
๊ฐ ๋ฐ์ค๋ง๋ค ์ ์ ์ ํ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํ๋ค. ์ฒซ ๋ฒ์งธ ๋ฐ์ค์ ๋ง์ง๋ง ๋ฐ์ค๋ ์ ์๋ฅผ ํ ๋ฒ๋ง ์ ํํ๋ฏ๋ก, ๊ฐ ์ ์๊ฐ ๊ธฐ์ฌํ๋ ๊ฐ ๊ทธ๋๋ก ๋ฐ์๋๋ค.
์ค๊ฐ ๋ฐ์ค๋ ์ ์๋ฅผ ๋ ๋ฒ ์ ํํ๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก, ์ฒซ ๋ฒ์งธ ์ ํ(์ ์์ ์๋ ์ซ์ ๊ธฐ๋ก)๊ณผ ๋ ๋ฒ์งธ ์ ํ(์ ์ ์ซ์๊ฐ 1๋ก ๋ณ๊ฒฝ๋จ)์ ๋ชจ๋ ๊ณ ๋ คํ์ฌ ๊ฒฝ์ฐ์ ์๋ฅผ ๋์ ํ๋ค.
๋์ ๊ณํ๋ฒ(DP)์ ์ด์ฉํด ๊ฐ ๋ฐ์ค์์ ๊ณ์ฐ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋์ ํ๋ฉฐ, ํ์ฌ๊น์ง ์ ํํ ์ ์๋ค์ ๊ณฑ์ gcd(k, ·) ๊ฐ์ ์ํ๋ก ํํํ์ฌ ์ ์ด๋ฅผ ์ํํ๋ค.
๋ชจ๋ ๋ฐ์ค๋ฅผ ์ฒ๋ฆฌํ ํ, ์ต์ข ์ํ๊ฐ k(์ฆ, k๋ก ๋๋์ด ๋จ์ด์ง๋ ์ํ)๊ฐ ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ l๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
๐ป ์ฝ๋ ๊ตฌํ (Java)
import java.io.*;
import java.util.*;
public class Main {
// ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ์ด์ฉํ์ฌ ์ต๋๊ณต์ฝ์(GCD)๋ฅผ ๊ตฌํ๋ ๋ฉ์๋
static long gcd(long a, long b) {
// b๊ฐ 0์ด ๋ ๋๊น์ง ๋ฐ๋ณต
while (b != 0) {
long temp = a % b; // a๋ฅผ b๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์์ ์ ์ฅ
a = b; // a์ b ๊ฐ์ ๋์
b = temp; // b์ ๋๋จธ์ง ๊ฐ์ ๋์
}
return a; // ์ต๋๊ณต์ฝ์ ๋ฐํ
}
public static void main(String[] args) throws Exception {
// ์
๋ ฅ์ ์ํ BufferedReader ์ด๊ธฐํ
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// ์ฒซ ๋ฒ์งธ ์ค ์
๋ ฅ: ๋ฐ์ค ๊ฐ์ n๊ณผ ๊ฐ ๋ฐ์ค๋น ์ ์ ๊ฐ์ m
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
// ๋ ๋ฒ์งธ ์ค ์
๋ ฅ: ๋ชฉํ ์ ์ k์ ๋ชจ๋๋ฌ ์ฐ์ฐ์ ์ฌ์ฉํ ๊ฐ mod
st = new StringTokenizer(br.readLine());
int k = Integer.parseInt(st.nextToken());
int mod = Integer.parseInt(st.nextToken());
// k์ ๋ชจ๋ ์ฝ์๋ฅผ ๊ตฌํจ (๊ฐ ์ํ๋ก ํ์ฉ)
ArrayList<Integer> dList = new ArrayList<>();
for (int i = 1; i * i <= k; i++) {
if (k % i == 0) {
dList.add(i);
if (i * i != k) {
dList.add(k / i);
}
}
}
// ์ฝ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
Collections.sort(dList);
int dCount = dList.size();
// ์ฝ์๋ฅผ ๋ฐฐ์ด์ ์ ์ฅ
int[] dArr = new int[dCount];
for (int i = 0; i < dCount; i++) {
dArr[i] = dList.get(i);
}
// ๊ฐ ์ฝ์์ ๋ํด ์ธ๋ฑ์ค๋ฅผ ๋งคํ (์ํ ์ ์ด ํ
์ด๋ธ ๊ตฌ์ฑ์ ํ์ฉ)
HashMap<Integer, Integer> dIndex = new HashMap<>();
for (int i = 0; i < dCount; i++) {
dIndex.put(dArr[i], i);
}
// ์ํ ์ ์ด ํ
์ด๋ธ ๊ตฌ์ฑ: ๋ ์ํ์ ๊ณฑ์ ๊ฒฐ๊ณผ์ ๋ํด gcd(k, ๊ณฑ) ๊ฐ์ ๋ฏธ๋ฆฌ ๊ณ์ฐ
int[][] mult = new int[dCount][dCount];
for (int i = 0; i < dCount; i++) {
for (int j = 0; j < dCount; j++) {
long product = (long) dArr[i] * dArr[j];
int g = (int) gcd(product, k);
mult[i][j] = dIndex.get(g);
}
}
// DP ๋ฐฐ์ด ์ด๊ธฐํ: dp[i]๋ ํ์ฌ ์ํ๊ฐ dArr[i]์ผ ๋์ ๊ฒฝ์ฐ์ ์
int[] dp = new int[dCount];
// ์ด๊ธฐ ์ํ๋ ์ ์ ์ ํ ์ ๊ณฑ์ด 1์ธ ์ํ
dp[dIndex.get(1)] = 1;
// ๊ฐ ๋ฐ์ค๋ฅผ ์์๋๋ก ์ฒ๋ฆฌ
for (int box = 1; box <= n; box++) {
// ํ์ฌ ๋ฐ์ค์ ์ ์๋ค์ ์ฝ์ด, ๊ฐ ์ ์์ ์ซ์์ ๋ฐ๋ฅธ ์ํ(์ฝ์ ์ํ)์ ๋น๋์๋ฅผ ๊ณ์ฐ
int[] freq = new int[dCount];
st = new StringTokenizer(br.readLine());
for (int j = 0; j < m; j++) {
int plateValue = Integer.parseInt(st.nextToken());
int g = (int) gcd(plateValue, k);
int idx = dIndex.get(g);
freq[idx]++; // ํด๋น ์ํ์ ๋น๋์ ์ฆ๊ฐ
}
// ํ์ฌ ๋ฐ์ค์์ ์ ํ ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์ ๋ถํฌ๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
int[] boxDist = new int[dCount];
// ์ฒซ ๋ฒ์งธ ๋ฐ์ค์ ๋ง์ง๋ง ๋ฐ์ค๋ ์ ์๋ฅผ ํ ๋ฒ๋ง ์ ํํ๋ฏ๋ก ๋จ์ํ freq ๊ฐ์ ์ฌ์ฉ
if (box == 1 || box == n) {
for (int i = 0; i < dCount; i++) {
boxDist[i] = freq[i] % mod;
}
} else {
// ์ค๊ฐ ๋ฐ์ค๋ ์ ์๋ฅผ ๋ ๋ฒ ์ ํํด์ผ ํจ
// ์ฒซ ๋ฒ์งธ ์ ํ: ์ ์์ ์๋ ์ซ์๋ฅผ ๊ธฐ๋ก
// ๋ ๋ฒ์งธ ์ ํ: ํด๋น ์ ์์ ์ซ์๊ฐ 1๋ก ๋ณํจ
int[] doubleDist = new int[dCount];
// ์ฒซ ๋ฒ์งธ ์ ํ์ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๊ฐ
for (int i = 0; i < dCount; i++) {
doubleDist[i] = (doubleDist[i] + freq[i]) % mod;
}
// ๋ ๋ฒ์งธ ์ ํ์ ๋ํด, ๊ฐ์ ์ ์๋ฅผ ๋ ๋ฒ ์ ํํ๋ ๊ฒฝ์ฐ์ ๋ค๋ฅธ ์ ์๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ๊ณ ๋ ค
for (int i = 0; i < dCount; i++) {
for (int j = 0; j < dCount; j++) {
long ways;
if (i == j) {
// ๊ฐ์ ์ ์๋ฅผ ๋ ๋ฒ ์ ํํ๋ ๊ฒฝ์ฐ
ways = (long) freq[i] * (freq[i] - 1);
} else {
// ์๋ก ๋ค๋ฅธ ์ ์๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ
ways = (long) freq[i] * freq[j];
}
if (ways == 0)
continue;
// ๋ ์ ํ์ ๊ฒฐ๊ณผ ์ํ๋ฅผ ์ํ ์ ์ด ํ
์ด๋ธ์ ์ด์ฉํด ๊ณ์ฐ
int newIndex = mult[i][j];
doubleDist[newIndex] = (int) ((doubleDist[newIndex] + ways) % mod);
}
}
boxDist = doubleDist;
}
// ํ์ฌ๊น์ง์ dp ๋ฐฐ์ด๊ณผ ํ์ฌ ๋ฐ์ค์ ๊ฒฝ์ฐ์ ์(boxDist)๋ฅผ ์ด์ฉํ์ฌ ์ํ ์ ์ด๋ฅผ ์ํ
int[] nextDP = new int[dCount];
for (int i = 0; i < dCount; i++) {
if (dp[i] == 0)
continue;
for (int j = 0; j < dCount; j++) {
if (boxDist[j] == 0)
continue;
int nextState = mult[i][j]; // ์ํ ์ ์ด
nextDP[nextState] = (int) ((nextDP[nextState] + (long) dp[i] * boxDist[j]) % mod);
}
}
// dp ๋ฐฐ์ด์ ์
๋ฐ์ดํธ
dp = nextDP;
}
// ์ต์ข
์ ์ผ๋ก ๋ชฉํ ์ํ k(์ฆ, k๋ก ๋๋์ด ๋จ์ด์ง๋ ์ํ)์ ๊ฒฝ์ฐ์ ์๋ฅผ mod๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅ
System.out.println(dp[dIndex.get(k)] % mod);
}
โฑ๏ธ ์๊ฐ ๋ณต์ก๋ ๋ถ์
๋ฌธ์ ๋ ๊ฐ ๋ฐ์ค๋ง๋ค m๊ฐ์ ์ ์๋ฅผ ์ฒ๋ฆฌํ๊ณ , k์ ์ฝ์ ๊ฐ์๋ฅผ d๋ผ ํ ๋ ์ ์ฒด ์๊ฐ ๋ณต์ก๋๋ O(n*m + n*d²)์ด๋ค.
n์ ์ต๋ 200, m์ ์ต๋ 10,000์ด๋ฉฐ, d๋ k์ ์ฝ์ ๊ฐ์๋ก ๋ณดํต √k์ ๊ฐ๊น์ ์ ํ ๋ด์์ ์ถฉ๋ถํ ๊ณ์ฐ ๊ฐ๋ฅํ๋ค.
๐ก ๋๋์
๋ฌธ์ ํด๊ฒฐ ๊ณผ์ ์์ ๊ฐ ๋ฐ์ค์์ ์ ์ ์ ํ์ ๋ฐ๋ฅธ ์ํ ์ ์ด๋ฅผ ๋ช
ํํ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ํต์ฌ์ด์๋ค.
์ ์๋ก ๊ณผ gcd๋ฅผ ํ์ฉํ์ฌ k์ ์ฝ์๋ฅผ ์ํ๋ก ์ฒ๋ฆฌํ ์ , ๊ทธ๋ฆฌ๊ณ ์ค๊ฐ ๋ฐ์ค์์ ๋ ๋ฒ ์ ํํ๋ ๊ฒฝ์ฐ๋ฅผ ์ธ๋ฐํ๊ฒ ๊ณ ๋ คํ ์ ์ด ์ธ์์ ์ด์๋ค.
'์๊ณ ๋ฆฌ์ฆ > BOJ - Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ/Java] 12422. ์ฐฝ๋ฌธ ๊นจ๊ธฐ (Large) (1) | 2025.03.14 |
---|---|
[BOJ/Java] 3628. Knockdown (0) | 2025.03.14 |
[BOJ/Java] 5266. Strange Dream (0) | 2025.03.13 |
[BOJ/Java] 11404. ํ๋ก์ด๋ (1) | 2025.03.10 |
[BOJ/Java] 2931. ๊ฐ์ค๊ด (0) | 2025.03.10 |