코테/백준

[백준/JAVA] 1947번: 선물 전달

imname1am 2023. 5. 11. 21:39
반응형

🔺 문제

 

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 알고리즘 코딩테스트 자바편

 

 

반응형