glowing713
Frontend-Deep-Dive
glowing713
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (97)
    • Languages (11)
      • JavaScript ๐Ÿ’› (3)
      • Python ๐Ÿ (4)
      • Java โ˜•๏ธ (3)
      • Swift ๐Ÿงก (1)
    • Computer_Science (1)
      • Computer_Network ๐Ÿ•ธ (1)
    • Web_Frontend (4)
      • Vue.js (1)
    • Problem_Solving (76)
    • Server (1)
      • Spring ๐Ÿ€ (1)
    • AI (2)
      • NLP ๐Ÿ—ฃ (1)
      • AI_Math โž— (1)
    • ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊พธ๋ฏธ๊ธฐ โœŒ (1)
    • ์ƒ๊ฐ์ •๋ฆฌ โœ๐Ÿป (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿง‘๐Ÿปโ€๐Ÿ’ปGithub

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • DP
  • bfs
  • Java
  • Python
  • ์นด์นด์˜ค ๊ธฐ์ถœ
  • ๋™์ ๊ณ„ํš๋ฒ•
  • Baekjoon
  • c++
  • brute-force
  • ์ด๋ถ„ํƒ์ƒ‰
  • BOJ
  • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
  • mst
  • Stack
  • binary search
  • ps
  • ์™„์ „ํƒ์ƒ‰
  • boostcampaitech
  • 2019 ์นด์นด์˜ค ๊ฐœ๋ฐœ์ž ๊ฒจ์šธ ์ธํ„ด์‹ญ
  • Algorithm

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
glowing713

Frontend-Deep-Dive

[BOJ] ๋ฐฑ์ค€ 9251 LCS / ๋™์  ๊ณ„ํš๋ฒ•(Dynamic-Programming)
Problem_Solving

[BOJ] ๋ฐฑ์ค€ 9251 LCS / ๋™์  ๊ณ„ํš๋ฒ•(Dynamic-Programming)

2020. 3. 14. 00:08

์ด๋ฏธ์ง€๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋ฌธ์ œ ์‚ฌ์ดํŠธ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.


 

 

๐Ÿ’ฃ ๋ฌธ์ œ ์ดํ•ด

 

 

๋งŽ์ด ์•Œ๋ ค์ง„  Longest Common Sequence(LCS)  ๋ฌธ์ œ์ด๋‹ค.

 

๋‘ ๋ฌธ์ž์—ด์ด ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์ด ๋‘ ๋ฌธ์ž์—ด์˜ ๊ณตํ†ต๋˜๋Š” ๋ถ€๋ถ„ ์ค‘ ๊ฐ€์žฅ ๊ธด ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

 

์ด ์™ธ๊ตญ ์œ ํŠœ๋ฒ„์˜ ํ’€์ด ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉฐ 3๊ฐ€์ง€ ํ’€์ด๋กœ ์ ‘๊ทผํ•ด๋ณด์•˜๋‹ค.

 

 

1. ์žฌ๊ท€ (Recursion)

2. ๋ฉ”๋ชจ์ด์ œ์ด์…˜ (Memoization)

3. ๋™์  ๊ณ„ํš๋ฒ• (Dynamic Programming)

 

 

 

 

๐Ÿ’ญ ํ’€์ด ๊ณผ์ •

 

 

 

1. ์žฌ๊ท€ ๋ฐฉ์‹์˜ ํ’€์ด

 

 

์ž‘์„ฑ ์–ธ์–ด: C++

 

#include <cstdio>	// c ํ‘œ์ค€ ์ž…์ถœ๋ ฅ
#include <algorithm>	// std::max

char str1[1001], str2[1001];

int LCS_recurs(int index1, int index2){
    if (str1[index1] == '\0' || str2[index2] == '\0') {
        return 0;
    }else if (str1[index1] == str2[index2]) {
        return 1 + LCS(index1 + 1, index2 + 1);
    }else {
    	return std::max(LCS(index1 + 1, index2), LCS(index1, index2 + 1));
	}
}

int main(){
    scanf(" %s %s", str1, str2); // ์ž…์ถœ๋ ฅ๋ฒ„ํผ์— '\n'์„ ๋‚จ๊ธฐ์ง€ ์•Š๊ธฐ ์œ„ํ•ด %s ์•ž์— ๊ณต๋ฐฑ์„ ๋‘ 
    printf("%d\n", LCS_recurs(0, 0));
    return 0;
}

 

 

LCS_recurs ํ•จ์ˆ˜์—์„œ ๋ณด์ด๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ, ์ฒซ ๋น„๊ต์˜ ์‹œ์ž‘์€ ๋‘ ๋ฌธ์ž์—ด์˜ 0๋ฒˆ ์ธ๋ฑ์Šค์ด๋‹ค.

 

๋งŒ์•ฝ ๋‘ ๋ฌธ์ž๊ฐ€ ๊ฐ™๋‹ค๋ฉด, ๋ฆฌํ„ด ๊ฐ’์— 1์„ ๋”ํ•˜๊ณ  ๋‘ ๋ฌธ์ž์—ด์˜ ๋‹ค์Œ ์ธ๋ฑ์Šค๋ฅผ ๋น„๊ตํ•œ๋‹ค.

 

๋‘ ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด, ํ•œ ๋ฌธ์ž์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ์ฆ๊ฐ€ํ•œ ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ์ฆ๊ฐ€ํ•œ ๊ฒƒ ์ค‘ ๋ฆฌํ„ด ๊ฐ’์ด ๋” ํฐ ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

๋‘ ๋ฌธ์ž ์ค‘ ํ•˜๋‚˜๋ผ๋„ '\0' ์ด๋ผ๋ฉด (๋ฌธ์ž์—ด์˜ ๋) 0 ์„ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

๊ทธ๋Ÿฌ๋‚˜,  ์ด ํ’€์ด๋Š” ์ง€์ˆ˜์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋ฏ€๋กœ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์ง€๋ฉด ๊ธฐํ•˜ ๊ธ‰์ˆ˜์ ์ธ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค.

 

 

 

 

2. ๋ฉ”๋ชจ์ด์ œ์ด์…˜

 

 

์ž‘์„ฑ ์–ธ์–ด: C++

 

#include <cstdio>	// c ํ‘œ์ค€ ์ž…์ถœ๋ ฅ
#include <algorithm>	// std::max

int memo[1001][1001] = {0, };
char str1[1001], str2[1001];

int LCS(int index1, int index2){
    if (memo[index1][index2] != 0) {
        return memo[index1][index2];
    }else {
        if (str1[index1] == '\0' || str2[index2] == '\0') {
            return 0;
        }else if (str1[index1] == str2[index2]) {
            return memo[index1][index2] = 1 + LCS(index1 + 1, index2 + 1);
        }else {
            return memo[index1][index2] = std::max(LCS(index1 + 1, index2), LCS(index1, index2 + 1));
        }
    }
}

int main(){
    scanf(" %s %s", str1, str2);	// ์ž…์ถœ๋ ฅ๋ฒ„ํผ์— '\n'์„ ๋‚จ๊ธฐ์ง€ ์•Š๊ธฐ ์œ„ํ•ด %s ์•ž์— ๊ณต๋ฐฑ์„ ๋‘ 
    printf("%d\n", LCS(0, 0));
    return 0;
}

 

 

์ด๋ฏธ ์ˆ˜ํ–‰ํ•œ ์—ฐ์‚ฐ์€ memo ๋ฐฐ์—ด์— ์ €์žฅ๋˜์–ด์žˆ์–ด์„œ ์ค‘๋ณต๋˜๋Š” ์—ฐ์‚ฐ์ด ํ˜ธ์ถœ๋˜๋ฉด ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.

 

๊ฒฐ๊ตญ ์ด ๋ฐฉ์‹์€ memo ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋งŒํผ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. => O(M*N)

 

 

 

 

3. ๋™์  ๊ณ„ํš๋ฒ•

 

 

์ž‘์„ฑ ์–ธ์–ด: C++

 

#include <cstdio>	// c ํ‘œ์ค€ ์ž…์ถœ๋ ฅ
#include <algorithm>	// std::max

int dp[1001][1001] = {0, };
char str1[1001], str2[1001];

int LCS_dp(int row, int col){
    for (int i = 1; i <= row; ++i) {
        for (int j = 1; j <= col; ++j) {
            if (str1[i-1] != str2[j-1]) {
                dp[i][j] = std::max(dp[i-1][j], dp[i][j-1]);
            }else {
                dp[i][j] = 1 + dp[i-1][j-1];
            }
        }
    }
    
    return dp[row][col];
}

int main(){
    int result;
    scanf(" %s %s", str1, str2);
    result = LCS_dp((int)strlen(str1), (int)strlen(str2));
    printf("%d\n", result);
    return 0;
}

 

 

์ž…๋ ฅ๋ฐ์ดํ„ฐ์ธ "ACAYKP" ์™€ "CAPCAK" ์„ ์˜ˆ๋กœ ํ’€์–ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

    C A P C A K
  0   0   0 0 0 0 0
A 0 0   1     1   1 1 1
C 0 1 1 1   2   2 2
A 0 1 2 2 2   3   3
Y 0 1 2 2 2   3   3
K 0 1 2 2 2 3   4  
P 0 1 2 3 3 3   4  

 

 

ACAYKP ์˜ 'A' ์™€ CAPCAK ๋ฅผ ๋จผ์ € ๋น„๊ตํ•œ๋‹ค.

๋‹ค๋ฅธ ๋ฌธ์ž๋ผ๋ฉด dp[i-1][j] ์™€ dp[i][j-1] ์ค‘ ๋” ํฐ ๊ฐ’์œผ๋กœ ์ฑ„์šฐ๊ณ , ๊ฐ™์€ ๋ฌธ์ž๋ผ๋ฉด dp[i-1][j-1] ์— ํ•˜๋‚˜ ๋” ์ฆ๊ฐ€ํ•œ ๊ฐ’์œผ๋กœ ์ฑ„์šด๋‹ค.

๋‹ค์Œ ACAYKP ์˜ 'C' ์™€ CAPCAK ๋ฅผ ๋น„๊ตํ•˜๋Š” ์ˆœ์„œ๋กœ ์ง„ํ–‰๋œ๋‹ค.

๋ฐฐ์—ด ๊ฐ€์žฅ ์šฐ์ธกํ•˜๋‹จ ํ•ญ ๊ฐ’์ด ์ตœ๋Œ€ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๊ฐ€ ๋œ๋‹ค.

 

๋˜ํ•œ ๊ฐ’์„ ์ถ”์ ํ•˜๋ฉด ๊ทธ ๊ณตํ†ต ์ˆ˜์—ด์ด "ACAK" ๋ผ๋Š” ๊ฒƒ๋„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

๋ฐฑ์ค€ ์ฑ„์  ์‹œ์Šคํ…œ์—์„œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ 288ms, ๋™์  ๊ณ„ํš๋ฒ•์€ 4ms ์ด๋ผ๋Š” ์‹คํ–‰์‹œ๊ฐ„์ด ๋‚˜์™”๋‹ค.

 

 

 

 

๐Ÿ† ๋ฐฐ์šด ์ 

 

 

์ž˜ ์•Œ๋ ค์ง„ LCS (Longest Common Sequence) ๋ฌธ์ œ ํ’€์ด๋ฅผ ์„ธ ๊ฐ€์ง€ ํ’€์ด๋กœ ์ ‘๊ทผํ•˜๋ฉด์„œ

 

๊ฐ ๊ธฐ๋ฒ•์„ ์ข€ ๋” ์ž˜ ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๊ณ ,

 

์‹คํ–‰์‹œ๊ฐ„์œผ๋กœ ์ˆ˜์น˜ํ™”๋œ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด ๋น„๊ตํ•˜๋ฉด์„œ ํšจ์œจ์„ฑ์„ ๋” ๋ช…ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์–ด ์œ ์ตํ•œ ํ’€์ด์˜€๋‹ค.

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'Problem_Solving' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[BOJ] ๋ฐฑ์ค€ 11055 ๊ฐ€์žฅ ํฐ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด / ๋™์  ๊ณ„ํš๋ฒ•(Dynamic-Programming)  (0) 2020.04.27
[BOJ] ๋ฐฑ์ค€ 11053 ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด / ๋™์  ๊ณ„ํš๋ฒ•(Dynamic-Programming)  (0) 2020.04.24
[BOJ] ๋ฐฑ์ค€ 12865 ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ / ๋™์  ๊ณ„ํš๋ฒ•(Dynamic-Programming)  (0) 2020.03.12
[BOJ] ๋ฐฑ์ค€ 11051 ์ดํ•ญ ๊ณ„์ˆ˜ 2 / ๋™์  ๊ณ„ํš๋ฒ•(Dynamic-Programming)  (0) 2020.03.11
[BOJ] ๋ฐฑ์ค€ 11057 ์˜ค๋ฅด๋ง‰ ์ˆ˜ / ๋™์  ๊ณ„ํš๋ฒ•(Dynamic-Programming)  (0) 2020.03.09
    'Problem_Solving' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [BOJ] ๋ฐฑ์ค€ 11055 ๊ฐ€์žฅ ํฐ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด / ๋™์  ๊ณ„ํš๋ฒ•(Dynamic-Programming)
    • [BOJ] ๋ฐฑ์ค€ 11053 ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด / ๋™์  ๊ณ„ํš๋ฒ•(Dynamic-Programming)
    • [BOJ] ๋ฐฑ์ค€ 12865 ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ / ๋™์  ๊ณ„ํš๋ฒ•(Dynamic-Programming)
    • [BOJ] ๋ฐฑ์ค€ 11051 ์ดํ•ญ ๊ณ„์ˆ˜ 2 / ๋™์  ๊ณ„ํš๋ฒ•(Dynamic-Programming)
    glowing713
    glowing713

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”