반응형
🔺 문제
1947번: 선물 전달
경우의 수를 1,000,000,000으로 나눈 나머지를 첫째 줄에 출력한다.
www.acmicpc.net
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
long mod = 1000000000;
long D[] = new long[1000001]; // N명일 때 선물 교환할 수 있는 모든 경우의 수
D[1] = 0;
D[2] = 1;
for(int i = 3 ; i <= N ; i++) {
D[i] = (i - 1) * (D[i - 2] + D[i - 1]) % mod; // 완전 순열 점화식
D[i] %= mod;
}
System.out.println(D[N]);
br.close();
}
}
|
cs |
✅ 해결 아이디어
✔ DP - 완전 순열 점화식
💥 유의사항
• 배열 D의 크기를 1000001로 해야 함 (N + 1로 하면 런타임 에러 남)
• 완전 순열 점화식
D[N] = (N - 1 ) * (D[N - 2] + D[N - 1])
⇨ 선물 교환 방식 2가지
1) 양방향 교환
- A와 B가 서로 선물 교환
- N명 中 2명이 교환 완료했으므로 남은 경우의 수 → D[N - 2]
2) 단방향 교환
- A는 B에게 선물 주지만, B는 다른 사람한테 줌.
- N명 中 1명이 교환 완료했으므로 남은 경우의 수 → D[N - 1]
💬 느낀 점
점화식을 잘 세워보자..
완전순열 점화식 아이디어만 생각나면 어렵지 않구만...
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V | 7/3 |
(+7/3 2회독)
식을 생각하진 못했지만..
다음엔 생각해보자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
long mod = 1_000_000_000;
// 🔔 D[N] : N명일 때 선물을 교환할 수 있는 모든 경우의 수
long[] D = new long[1000001];
D[1] = 0;
D[2] = 1;
for(int i = 3 ; i <= N ; i++) {
D[i] = (i - 1) * (D[i - 2] + D[i - 1]) % mod; // 📍 완전 순열 점화식 📍
}
System.out.println(D[N]);
}
}
|
cs |
(참고)
✔ Do it 알고리즘 코딩테스트 자바편
반응형
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 14501번: 퇴사 (0) | 2023.05.15 |
---|---|
[백준/JAVA] 1463번: 1로 만들기 (0) | 2023.05.14 |
[백준/JAVA] 1256번: 사전 (0) | 2023.05.11 |
[백준/JAVA] 1722번: 순열의 순서 (0) | 2023.05.11 |
[백준/JAVA] 13251번: 조약돌 꺼내기 (0) | 2023.05.10 |