๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ

[C++/BOJ] 10942 : ํŒฐ๋ฆฐ๋“œ๋กฌ? (DP)

728x90

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

 

๋ฌธ์ œ

๋ช…์šฐ๋Š” ํ™์ค€์ด์™€ ํ•จ๊ป˜ ํŒฐ๋ฆฐ๋“œ๋กฌ ๋†€์ด๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๋จผ์ €, ํ™์ค€์ด๋Š” ์ž์—ฐ์ˆ˜ N๊ฐœ๋ฅผ ์น ํŒ์— ์ ๋Š”๋‹ค. ๊ทธ ๋‹ค์Œ, ๋ช…์šฐ์—๊ฒŒ ์งˆ๋ฌธ์„ ์ด M๋ฒˆ ํ•œ๋‹ค.

๊ฐ ์งˆ๋ฌธ์€ ๋‘ ์ •์ˆ˜ S์™€ E(1 ≤ S ≤ E ≤ N)๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, S๋ฒˆ์งธ ์ˆ˜๋ถ€ํ„ฐ E๋ฒˆ์งธ ๊นŒ์ง€ ์ˆ˜๊ฐ€ ํŒฐ๋ฆฐ๋“œ๋กฌ์„ ์ด๋ฃจ๋Š”์ง€๋ฅผ ๋ฌผ์–ด๋ณด๋ฉฐ, ๋ช…์šฐ๋Š” ๊ฐ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค ๋˜๋Š” ์•„๋‹ˆ๋‹ค๋ฅผ ๋งํ•ด์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ™์ค€์ด๊ฐ€ ์น ํŒ์— ์ ์€ ์ˆ˜๊ฐ€ 1, 2, 1, 3, 1, 2, 1๋ผ๊ณ  ํ•˜์ž.

  • S = 1, E = 3์ธ ๊ฒฝ์šฐ 1, 2, 1์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค.
  • S = 2, E = 5์ธ ๊ฒฝ์šฐ 2, 1, 3, 1์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด ์•„๋‹ˆ๋‹ค.
  • S = 3, E = 3์ธ ๊ฒฝ์šฐ 1์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค.
  • S = 5, E = 7์ธ ๊ฒฝ์šฐ 1, 2, 1์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค.

์ž์—ฐ์ˆ˜ N๊ฐœ์™€ ์งˆ๋ฌธ M๊ฐœ๊ฐ€ ๋ชจ๋‘ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ช…์šฐ์˜ ๋Œ€๋‹ต์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด์˜ ํฌ๊ธฐ N (1 ≤ N ≤ 2,000)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„์—๋Š” ํ™์ค€์ด๊ฐ€ ์น ํŒ์— ์ ์€ ์ˆ˜ N๊ฐœ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ์น ํŒ์— ์ ์€ ์ˆ˜๋Š” 100,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

์…‹์งธ ์ค„์—๋Š” ํ™์ค€์ด๊ฐ€ ํ•œ ์งˆ๋ฌธ์˜ ๊ฐœ์ˆ˜ M (1 ≤ M ≤ 1,000,000)์ด ์ฃผ์–ด์ง„๋‹ค.

๋„ท์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์—๋Š” ํ™์ค€์ด๊ฐ€ ๋ช…์šฐ์—๊ฒŒ ํ•œ ์งˆ๋ฌธ S์™€ E๊ฐ€ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ด M๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ํ™์ค€์ด์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋ช…์šฐ์˜ ๋‹ต์„ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ์ˆœ์„œ์— ๋”ฐ๋ผ์„œ ์ถœ๋ ฅํ•œ๋‹ค. ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ ๊ฒฝ์šฐ์—๋Š” 1, ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” 0์„ ์ถœ๋ ฅํ•œ๋‹ค.


 

๊ณจ๋“œ 4..

์ผ๋‹จ ๋ฌธ์ œ๋ฅผ ์ฝ๊ณ  ๋– ์˜ค๋ฅด๋Š”๋Œ€๋กœ ๋ฐ”๋กœ ํ’€์–ด๋ดค๋”๋‹ˆ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋–ด๋‹ค.

 

// ์‹œ๊ฐ„์ดˆ๊ณผ ์ฝ”๋“œ
int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n;
    int nlist[2001] = {0};
    int m;
    int s;
    int e;
    cin >> n;
    for (int i = 0; i < n; ++i) cin >> nlist[i];
    cin >> m;
    for (int i = 0; i < m; ++i){
        bool tf = true;
        cin >> s >> e;
        for (int j = s - 1; j < e; ++j){
            if(nlist[j] != nlist[e-1]) tf=false;
            e--;
        }
        if(tf) cout <<"1\n";
        else cout <<"0\n";
    }
}

 

๊ทธ๋ž˜์„œ ์Œ.....dp๋กœ ํ’€์–ด์•ผ๋ ๊ฑฐ๊ฐ™์€๋ฐ

๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ๋ฌธ๋“ ์Šค์นœ ์ƒ๊ฐ.

dp๋กœ ์‹œ์ž‘์ ๊ณผ ์ข…๋ฃŒ์ ์˜ ๊ฐ’์„ ๊ธฐ์–ตํ•ด์•ผ ํ•˜๋‚˜? ์ด์ฐจ์›๋ฐฐ์—ด?

 

dp[์‹œ์ž‘์ ][์ข…๋ฃŒ์ ] = ํŒฐ๋ฆฐ๋“œ๋กฌ ์—ฌ๋ถ€

 

์ด ์•„์ด๋””์–ด๊ฐ€ ๋– ์˜ฌ๋ผ์„œ ๊ทธ๋ ‡๊ฒŒ ํ’€์–ด๋ณด์•˜๋‹ค

 

1 2 1 3 1 2 1

์œ„ 7์ž๋ฆฌ ์˜ˆ์‹œ๋ฅผ dp ํ‘œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด, ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ผ ๋•Œ, 0์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด ์•„๋‹ ๋•Œ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค

from \ to 1 2 3 4 5 6 7
1 dp[1][1] = 1 dp[1][2] = 0 1 0 0 0 1
2 - 1 0 0 0 1 0
3 - - 1 0 1 0 0
4 - - - 1 0 0 0
5 - - - - 1 0 1
6 - - - - - 1 0
7 - - - - - - 1

 

๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ทœ์น™์€, i == j ์ผ๋•Œ๋Š” ํ•ญ์ƒ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋ฉฐ 1์˜ ๋‹ค์Œ ๊ฐ’์€ ํ•ญ์ƒ 0์ด๋‹ค. -> ๊ทผ๋ฐ ์ด๊ฑฐ ์กฐ๊ฑดํŒ๋ณ„์— ๋„ฃ์œผ๋ฉด ํ‹€๋ฆผ.. ์‹œ๊ฐ„์ดˆ๊ณผ๋˜๋‚˜?

๋ถˆํ•„์š”ํ•œ ์กฐ๊ฑด ๊ฑฐ๋ฅด๋Š”๊ฑด ๊ฑ ๋ฌด์‹œํ•˜๊ณ 

1์ด ๋˜๋Š” ๊ฒฝ์šฐ๋งŒ ์ƒ๊ฐํ•ด์•ผ๊ฒ ๋‹ค

 

์กฐ๊ฑด์€

1.  dp[i][i]๋Š” ํ•ญ์ƒ 1์ด๋‹ค.

2.  nlist[i]์™€ nlist[i+1]์ด ๊ฐ™๋‹ค๋ฉด, dp[i][i+1]๋Š” ํ•ญ์ƒ 1์ด๋‹ค.

3.  ์ž˜๋ž์„๋•Œ ๋งจ์•ž์˜ ์ˆ˜==๋งจ๋’ค์˜ ์ˆ˜ && dp[๋งจ์•ž+1][๋งจ๋’ค-1] ์ด 1์ด๋ฉด dp[i][j]๋Š” ํ•ญ์ƒ 1์ด๋‹ค.

 

์ด๋ ‡๊ฒŒ๋งŒ ๋”ฐ์ ธ์„œ ํ’€์—ˆ๋‹ค..

๊ฐœ๊ฐ™์€ ๋ฌธ์ œ!

 

 

 

๋‚˜์˜ ํ’€์ด

#include <iostream>
using namespace std;

int nlist[2001] = {0};
int dp[2001][2001] = {0};

int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n; int m;
    
    cin >> n;
    for (int i = 1; i <= n; ++i){
        cin >> nlist[i];
    }

    for (int i = 1; i < n; ++i){
        dp[i][i] = 1;
        if(nlist[i]==nlist[i+1]) {
            dp[i][i+1] = 1;
        }
    }
    dp[n][n] = 1;

    for (int i = n; i > 0; --i){
        for (int j = n; j >= i; --j){
            if(nlist[i] == nlist[j] && dp[i+1][j-1] == 1) dp[i][j] = 1;
        }
    }

    int s;
    int e;

    cin >> m;
    for (int i = 0; i < m; ++i){
        cin >> s >> e;
        cout << dp[s][e]<<"\n";
    }
}

 

์˜ค๋žœ๋งŒ์— ๋‘๋‡ŒํšŒ์ „ ๋นก์„ธ๊ฒŒ ์‹œ์ผฐ๋”๋‹ˆ ํ”ผ๊ณคํ•˜๋„ค

 

728x90