๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] Swift 2302 ๊ทน์žฅ ์ขŒ์„ DP

by Jouureee 2022. 4. 17.

๋ฌธ์ œ :

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

 

2302๋ฒˆ: ๊ทน์žฅ ์ขŒ์„

์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด์„œ ์‚ฌ๋žŒ๋“ค์ด ์ขŒ์„์— ์•‰์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ๊ฐ€์ง“์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋ฐฉ๋ฒ•์˜ ๊ฐ€์ง“์ˆ˜๋Š” 2,000,000,000์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. (2,000,000,000 < 231-1)

www.acmicpc.net

 

๋ถ„์„ :

์ฒ˜์Œ์—๋Š” VIP ์ขŒ์„๋งŒ ๋”ฐ๋กœ 1๋กœ ๋ฐฐ์—ด์„ ๋ฐ›๊ณ  1์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ  ๋ฐฐ์—ด์„ ์นธ๋งŒํผ ๊ณฑํ•˜๋ฉด(ํ•œ์นธ์”ฉ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ) ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€ ? ์ƒ๊ฐํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ์ถœ ํ›„ ํ‹€๋ฆฌ๊ณ  ๋ณด๋‹ˆ ๋ฐฐ์—ด์นธ๋งŒํผ์€ ๋‘์‚ฌ๋žŒ๋ผ๋ฆฌ๋งŒ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊ฟจ์„๋•Œ๋”๋ผ ใ…Ž

๋งŒ์•ฝ 

์ด๋Ÿฌํ•œ ๋ฐฐ์—ด์ด ์žˆ์„๋•Œ

1,2,3,4 ์ค‘ ๋‘ ์ˆ˜ ์˜ˆ๋ฅผ ๋“ค์–ด 1,2๋งŒ ์ž๋ฆฌ ๋ฐ”๊ฟจ์„๋•Œ ๋ชจ๋“  ์ˆ˜์— ๋Œ€ํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ์›์†Œ์˜ ๊ฐœ์ˆ˜๋งŒํผ 4์ด์ง€๋งŒ

12๊ฐ€ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ๋Š” ์‚ฌ์ด 34๋„ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊ฟ€์ˆ˜ ์žˆ๋‹ค ๊ทธ๋ž˜์„œ ์ด๊ฑฐ๋Š” ์ด๋ ‡๊ฒŒ ํ’€๋ฉด ์•ˆ๋˜๊ณ  ๋‹ค์‹œ DP๋กœ ์ ‘๊ทผํ•˜์˜€๋‹ค.

๊ฐ ๋ถ€๋ถ„ ๋ฐฐ์—ด์— ๋Œ€ํ•ด ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ๊ณ  ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ์˜์ˆ˜๋งŒํผ ๊ณฑํ•ด์ค€๋‹ค. 

 

๊ทธ๋ ‡๋‹ค๋ฉด ๋ถ€๋ถ„ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ž๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ๋ฐ”๊พธ๋Š”๊ฐ€ ?

์ ํ™”์‹ d๋Š” n๊ฐœ์˜ ์›์†Œ๋ฅผ ๊ฐ€์ง€๋Š” ๋ถ€๋ถ„ ๋ฐฐ์—ด์— ๋Œ€ํ•ด n๋ฒˆ์งธ ์›์†Œ๊ฐ€ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ๋Š”์ง€ ์•ˆ๋ฐ”๊พธ๋Š”์ง€๋กœ ๊ฒฝ์šฐ์˜์ˆ˜๊ฐ€ ๋‚˜๋‰œ๋‹ค.

n๋ฒˆ์งธ ์›์†Œ๊ฐ€ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค โŒ : 1 ~ n-1๋ฒˆ์งธ ์›์†Œ์— ๋Œ€ํ•ด ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ƒ๊ฐํ•œ๋‹ค.

n๋ฒˆ์งธ ์›์†Œ๊ฐ€ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พผ๋‹ค ๐Ÿ†— : ๊ทธ๋ ‡๋‹ค๋ฉด n-1๋ฒˆ์งธ ์›์†Œ์™€ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค ๋”ฐ๋ผ์„œ n-1, n๋ฒˆ์งธ ์›์†Œ๋ฅผ ์ œ์™ธํ•œ 1 ~ n-2๋ฒˆ์งธ ์›์†Œ์— ๋Œ€ํ•œ ๊ฒฝ์šฐ์˜์ˆ˜๋ฅผ ์ƒ๊ฐํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์ ํ™”์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

d[n] = d[n-1] + d[n-2] (์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•œ ์ ํ™”์‹์ด๋‹ค ๊ธฐ์ค€๋งŒ ์ž˜์„ธ์šด๋‹ค๋ฉด ..)

 

Swift ์ฝ”๋“œ :

//
//  main.swift
//  SOMA๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป
//
//  Created by JoSoJeong on 2022/04/16.
//

import Foundation
var n = Int(readLine()!)!
var arr = Array(repeating: 0, count: n)
var m = Int(readLine()!)!
for _ in 0..<m {
    let vip = Int(readLine()!)!
    arr[vip-1] = 1
}
var result = 1
for i in arr.split(separator: 1) {
    var d = Array(repeating: 0, count: i.count)
    if i.count == 1 || i.count == 2 {
        result *= i.count
    }else {
        d[0] = 1 // 1๋ช…
        d[1] = 2 // 2๋ช…
        for num in 2..<i.count {
            d[num] = d[num-1] + d[num-2]
        }
        result *= d[i.count - 1]
    }
}

print(result)

๋Œ“๊ธ€