관리 메뉴

Partially Committed

[λ°±μ€€ 1947] μ„ λ¬Ό 전달 (JAVA) λ³Έλ¬Έ

πŸ”₯ Algorithm || λ¬Έμ œν’€μ΄/PS

[λ°±μ€€ 1947] μ„ λ¬Ό 전달 (JAVA)

WonderJay 2023. 1. 27. 10:45
728x90
λ°˜μ‘ν˜•
SMALL

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

 

1947번: μ„ λ¬Ό 전달

경우의 수λ₯Ό 1,000,000,000으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 첫째 쀄에 좜λ ₯ν•œλ‹€.

www.acmicpc.net

n λͺ…μ˜ μ‚¬λžŒμ΄ μ„œλ‘œμ˜ 선물을 κ΅ν™˜ν•˜λŠ”λ°, 자기의 선물을 자기 μžμ‹ μ΄ λ°›μœΌλ©΄ μ•ˆλœλ‹€.

 

μ΄λŸ¬ν•œ 상황은 μ™„μ „ μˆœμ—΄μ„ μ΄ν•΄ν•˜κ³  있으면 μ‰½κ²Œ ꡬ할 수 μžˆλ‹€.

 

https://namu.wiki/w/%EC%99%84%EC%A0%84%EC%88%9C%EC%97%B4

 

μ™„μ „μˆœμ—΄ - λ‚˜λ¬΄μœ„ν‚€

μ™„μ „μˆœμ—΄μ„ λ‹€λ£¨λŠ” λ¬Έμ œμ—μ„œλŠ”, κ·Έλƒ₯ D5D_5D5β€‹κΉŒμ§€λŠ” μ™Έμ›Œλ‘μž. μ°¨λ‘€λŒ€λ‘œ 0,1,2,9,440, 1, 2, 9, 440,1,2,9,44이닀. D5=44D_5=44D5​=44λ§ˆμ €λ„ λ„ˆλ¬΄ λ§Žλ‹€κ³  ν•˜μ—¬ 잘 λ‚˜μ˜€μ§€ μ•ŠμœΌλ©° D6=265D_6=265D6​=265λΆ€ν„°λŠ” 경우

namu.wiki

μ°¨κ·Ό μ°¨κ·Ό 점화식을 λ– μ˜¬λ €λ³΄μž.

 

dp[n] 을 n λͺ…μ˜ μ‚¬λžŒμ΄ μžˆμ„ λ•Œ, λͺ¨μžλ₯Ό κ΅ν™˜ν•  수 μžˆλŠ” 경우의 수라고 κ°€μ •ν•˜μž.

 

μ‚¬λžŒμ΄  0λͺ…μ΄κ±°λ‚˜ 1 λͺ…인 κ²½μš°μ—λŠ” λ‹Ήμ—°νžˆ dp[n] = 0 이닀.

 

μ‚¬λžŒμ΄ 2 λͺ…이라면 dp[n] = 1 이닀. μ„œλ‘œκ°€ μ„œλ‘œμ˜ λͺ¨μžλ₯Ό λ°›λŠ” κ²½μš°λ°–μ— μ—†λ‹€.

 

n λͺ…이라고 μƒκ°ν–ˆμ„ λ•Œ, κ·Έ 쀑 2λͺ…(a,b)을 νŠΉμ •μ§€μ–΄μ„œ μƒκ°ν•΄λ³΄μž.

 

a λŠ” b μ—κ²Œ 선물을 μ£Όμ—ˆλ‹€κ³  κ°€μ •ν•˜κ³ ,

 

b κ°€ 선물을 전달할 수 μžˆλŠ” κ²½μš°λŠ” 두 가지 밖에 μ—†λ‹€.

 

1. b 도 a μ—κ²Œ μ£ΌλŠ” 경우 (이러면 μ–‘λ°©ν–₯으둜 κ΅ν™˜ν•¨)

>> 그러면 n λͺ… μ€‘μ—μ„œ 2 λͺ…이 λ°›λŠ” 선물은 ν™•μ •λœ 것이닀. κ·ΈλŸ¬λ―€λ‘œ dp[n-2]

 

2. b λŠ” a κ°€ μ•„λ‹Œ λ‹€λ₯Έ μ‚¬λžŒμ—κ²Œ μ£ΌλŠ” 경우

>> 그러면 b κ°€ μ€€ 선물을 받을 μ‚¬λžŒμ€ ν™•μ •λ˜μ§€ μ•Šμ•˜κ³ , b κ°€ a λ‘œλΆ€ν„° 선물을 λ°›λŠ”λ‹€λŠ” κ²ƒλ§Œ ν™•μ •λœλ‹€. dp[n-1]

 

(*) λ‹€μ‹œ λŒ€μ „μ œλ‘œ λŒμ•„κ°€μ„œ, n λͺ… 쀑에 a 와 b λ₯Ό μ„ νƒν•˜λŠ” 상황을 μƒκ°ν•΄λ³΄μž.

a λŠ” κ³¨λžλ‹€κ³  치면, b λŠ” n-1 λͺ… 쀑에 1λͺ…이 될 것이닀. 즉 b λ₯Ό κ³ λ₯΄λŠ” 경우의 μˆ˜λŠ” n-1 이닀.

 

μ’…ν•©ν•˜λ©΄ dp[n] = (n-1)*(dp[n-1]+dp[n-2]) 와 같은 점화식을 얻을 수 있고,

 

이λ₯Ό μ±„μ›Œλ„£μœΌλ©΄ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.

 

β€» λ‚˜λ¨Έμ§€ 연산을 μˆ˜ν–‰ν•  λ•Œμ—λŠ”, ν…Œμ΄λΈ”μ— 값을 λ„£κΈ° 전에 μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€λŠ” 것을 μ‘°μ‹¬ν•˜μž. μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•΄λ²„λ¦¬λ©΄ 값이 잘λͺ» μ €μž₯λ˜λ‹ˆκΉŒ!

 

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        System.setIn(new FileInputStream("src/input.txt"));
        Scanner sc = new Scanner(System.in);
        long mod = 1000000000;
        int n = sc.nextInt();
        long [] dp = new long[1000001];

        dp[0] = 0;
        dp[1] = 0;
        dp[2] = 1;

        for(int i = 3; i <= n; i++){
            dp[i] = (i-1)*(dp[i-2]+dp[i-1])%mod;
        }
        System.out.println(dp[n]);
    }
}

728x90
λ°˜μ‘ν˜•
LIST
Comments