๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐˜š๐˜ญ๐˜ฐ๐˜ธ ๐˜ฃ๐˜ถ๐˜ต ๐˜ด๐˜ต๐˜ฆ๐˜ข๐˜ฅ๐˜บ

[๋ฐฑ์ค€] 11053๋ฒˆ: ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด - C++ ๋ณธ๋ฌธ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ค€๋น„/๋ฐฑ์ค€

[๋ฐฑ์ค€] 11053๋ฒˆ: ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด - C++

.23 2021. 7. 24. 01:32
๋ฌธ์ œ

์ˆ˜์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆ˜์—ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์€ A = {10, 20, 10, 30, 20, 50} ์ด๊ณ , ๊ธธ์ด๋Š” 4์ด๋‹ค.

 

์ž…๋ ฅ

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

๋‘˜์งธ ์ค„์—๋Š” ์ˆ˜์—ด A๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๋Š” Ai๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Ai ≤ 1,000)

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


DP๋ฅผ ์ด์šฉํ•˜์—ฌ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ. ์—ฌํƒœ๊นŒ์ง€ ํ’€์—ˆ๋˜ ๋‹ค๋ฅธ DP๋ฌธ์ œ๋“ค๊ณผ ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ ์ ‘๊ทผํ•ด์•ผ๋ผ์„œ ์–ด๋ ค์› ๋˜ ๋ฌธ์ œ๊ฐ™๋‹ค. ๊ฒ€์ƒ‰ํ•ด๋ณด๋‹ˆ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ ์œ ํ˜•์„ LIS(Longest Increasing Subsequence)๋ผ๊ณ  ํ•˜๋”๋ผ

์ˆ˜์—ด์„ ๋‹ด์„ ๋ฐฐ์—ด A์™€ ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ๊ธฐ๋กํ•  ๋ฐฐ์—ด D๋ฅผ ์„ ์–ธํ•œ ํ›„, A์˜ 1๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ์ ๊ฒ€์„ ํ•œ๋‹ค. ์ž์‹ (i)๋ณด๋‹ค ์ด์ „์— ์žˆ๋Š” ์›์†Œ๋“ค๊ณผ ๋น„๊ตํ•ด๊ฐ€๋ฉฐ ์ž‘์€ ๊ฐ’์ด ์กด์žฌํ•  ๊ฒฝ์šฐ D์— ์žˆ๋Š” ๊ฐ’์„ ๋น„๊ตํ•ด๊ฐ€๋ฉฐ ๊ฐ€์žฅ ํฐ ๊ฐ’(์ตœ๋Œ€ ๊ธธ์ด)์„ D[i]์— ๋Œ€์ž…ํ•œ๋‹ค. ์ด๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ฆฌํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

1. A ๋ฐฐ์—ด ๋‚ด์—์„œ A[i]๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค. (1 ≤ i ≤ N, 1 ≤ j < i)

2. A[i]๋ณด๋‹ค ์ž‘์€ ๊ฐ’์ธ ์›์†Œ์˜ ์œ„์น˜๋ฅผ j๋ผ๊ณ  ํ•  ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ D[i]๋ฅผ ๊ตฌํ•œ๋‹ค.

        2-1. D[i] D[j], A[i]๊นŒ์ง€์˜ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋Š” A[j]๊นŒ์ง€์˜ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด D[j]์— A[i]๋ฅผ ํฌํ•จํ•˜์—ฌ 1์„ ๋”ํ•œ ๊ฐ’์ด๋ฏ€๋กœ D[i] = D[j] + 1

        2-2. D[i] > D[j], A[i]๊นŒ์ง€์˜ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋Š” ์—ฌ์ „ํžˆ D[i] = D[i]

3. D[i]๊นŒ์ง€์˜ ๊ฐ’ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’(์ตœ๋Œ€ ๊ธธ์ด)์„ length์— ์ €์žฅ.

 

์—ฌ๋‹ด์œผ๋กœ ๊ฐ’ ๋น„๊ต ๋ถ€๋ถ„์—์„œ (memo[i] > memo[j] ? memo[i] : memo[j] + 1) ๋ฅผ (memo[i] > memo[j] ? memo[i] : memo[i] + 1)๋กœ ์ผ๋Š”๋ฐ ๋‹ต์ด ํ†ต๊ณผ๋์—ˆ๋‹ค. ..์™œ๊ทธ๋Ÿฐ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.

์ฝ”๋“œ
#include <cstdio>
#define MAX 1001

int DP(int num);

int main(void) {
    int n;
    scanf("%d", &n);
    printf("%d\n", DP(n));
    return 0;
}

int DP(int num) {
    int A[MAX] = { 0 };
    int memo[MAX] = { 0 };
    int length = 0;

    for(int i = 1; i <= num; i++) {
        scanf("%d", &A[i]);
    }

    for(int i = 1; i <= num; i++) {
        memo[i] = 1;
        for(int j = 1; j < i; j++) {
            if(A[i] > A[j]) {
                memo[i] = (memo[i] > memo[j] ? memo[i] : memo[j] + 1);
            }
        }
        length = (length > memo[i] ? length : memo[i]);
    }

    return length;
}
Comments