๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/4๋‹จ๊ณ„

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv4] : ๋‹จ์–ด ํผ์ฆ

by Jaeguk 2022. 7. 11.
๋ฌธ์ œ ๋งํฌ

https://school.programmers.co.kr/learn/courses/30/lessons/12983

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

์™„์„ฑ์‹œ์ผœ์•ผ ํ•  ๋‹จ์–ด์™€ ๋‹จ์–ด ์กฐ๊ฐ๋“ค์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์›ํ•˜๋Š” ๋‹จ์–ด๋ฅผ ์™„์„ฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋‹จ์–ด ์กฐ๊ฐ์˜ ์ˆ˜์˜ ์ตœ์†Œ๊ฐ’์„ ๋ฆฌํ„ดํ•˜์ž.

 

ํ’€์ด
  • ๋‚˜์˜ ์ฒ˜์Œ ์ ‘๊ทผ๋ฐฉ์‹

๋‚˜๋Š” ์ผ๋‹จ ํŠน๋ณ„ํ•œ ๋ฐฉ๋ฒ•์ด ๋– ์˜ค๋ฅด์ง€ ์•Š๋Š” ํ•œ, ์ผ๋‹จ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋Š” ๋ฐฉ์‹์„ ํƒํ•œ๋‹ค.

๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ†ตํ•ด์„œ ๋‹จ์–ด ์กฐ๊ฐ๋“ค์„ ์ด์–ด๋ถ™์—ฌ์„œ ๋‹จ์–ด๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋Š” ๋ฐฉ์‹์ด๋‹ค.

๋งŒ๋“ค์–ด์ง„ ๋‹จ์–ด์˜ ๊ธธ์ด๊ฐ€ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๋‹จ์–ด์˜ ๊ธธ์ด๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์•„์กŒ์„ ๋•Œ๋Š” ์ด์ œ ๋น„๊ต๋ฅผ ํ•˜๊ณ  ๋ฆฌํ„ด์„ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

๋งŒ์•ฝ ๋งŒ๋“ค์–ด์ง„ ๋‹จ์–ด์˜ ๊ธธ์ด๊ฐ€ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๋‹จ์–ด์˜ ๊ธธ์ด๋ณด๋‹ค ๊ธธ๋‹ค๋ฉด ๋น„๊ต ํ•  ํ•„์š”๋„ ์—†์ด ๊ฐ™์ง€ ์•Š์€ ๋‹จ์–ด๋‹ค.

๋งŒ๋“ค์–ด์ง„ ๋‹จ์–ด์™€ ๋งŒ๋“ค์–ด์•ผ ํ•  ๋‹จ์–ด๊ฐ€ ๊ฐ™๋‹ค๋ฉด? ์ด๋•Œ ์‚ฌ์šฉ๋œ ์กฐ๊ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ํ˜„์žฌ answer์— ์ €์žฅ๋œ ๊ฐ’๊ณผ ๋น„๊ตํ•ด์„œ ์ตœ์†Œ๊ฐ’์„ answer์— ์ €์žฅํ•œ๋‹ค.

 

์•„๋ฌด๋ž˜๋„ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋”ฐ์ง€๋‹ค ๋ณด๋‹ˆ, ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ ค ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ๋ฐ›์•˜๋‹ค.

๋‚˜๋ฆ„ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด 2๊ฐ€์ง€ ์žฅ์น˜๋ฅผ ๋„ฃ์–ด์คฌ๋‹ค.

1. ๊ธฐ์กด์— ์ €์žฅ๋œ answer ๋ณด๋‹ค ๋งŽ๊ฑฐ๋‚˜ ๊ฐ™์€ ๋‹จ์–ด์กฐ๊ฐ์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด, ๋” ๋งŒ๋“ค์–ด๋ณผ ํ•„์š”๋„ ์—†์ด ๋ฆฌํ„ดํ•œ๋‹ค.

2. ๋‹จ์–ด ์กฐ๊ฐ์˜ ์‹œ์ž‘ ์•ŒํŒŒ๋ฒณ์„ ๊ธฐ์ค€์œผ๋กœ ๋‹จ์–ด ์กฐ๊ฐ์„ ๋ถ„๋ฅ˜ํ•ด๋‘์—ˆ๋‹ค.

๋งŒ์•ฝ "banana" ๋ผ๋Š” ๋‹จ์–ด๋ฅผ ๋งŒ๋“œ๋ ค๊ณ  ํ•˜๋Š”๋ฐ, ํ˜„์žฌ "ban" ๊นŒ์ง€ ๋งŒ๋“ค์–ด ์กŒ๋‹ค๋ฉด "ana" ๋งŒ ๋งŒ๋“ค์–ด ์ฃผ๋ฉด ๋œ๋‹ค.

์ด๋•Œ ๋‹จ์–ด์กฐ๊ฐ์„ ์ด์–ด๋ถ™์ผ ๋•Œ ๋ชจ๋“  ๋‹จ์–ด ์กฐ๊ฐ์„ ์ด์–ด๋ถ™์—ฌ๋ณผ ํ•„์š”๋Š” ์—†๋‹ค. a๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ์–ด์กฐ๊ฐ๋“ค ์ค‘์—์„œ๋งŒ ์ด์–ด๋ถ™์—ฌ์ฃผ๋ฉด ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ํ™• ์ค„์–ด๋“ค ๊ฒƒ์ด๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋‚˜๋ฆ„ ๋จธ๋ฆฌ๋ฅผ ๊ตด๋ ค๋ดค์ง€๋งŒ, ์‹œ๊ฐ„์ดˆ๊ณผ๋Š” ํ”ผํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

 

  • ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ํ’€์ด

์งˆ๋ฌธํ•˜๊ธฐ์— ๋“ค์–ด๊ฐ€๋ดค๋”๋‹ˆ, ์‚ฌ๋žŒ๋“ค์ด DP๋กœ ํ’€์—ˆ๋‹ค๊ณ  ํ–ˆ๋‹ค.

๋„์ €ํžˆ DP๋กœ ํ’€์ดํ•  ๋ฐฉ๋ฒ•์ด ๋– ์˜ค๋ฅด์ง€ ์•Š์•„์„œ ๊ตฌ๊ธ€์— ์žˆ๋Š” ๋ธ”๋กœ๊ทธ๋“ค์„ ์ฐธ๊ณ ํ–ˆ๋‹ค.

DP๋ฐฐ์—ด์€ 1์ฐจ์› ๋ฐฐ์—ด๋กœ ๋งŒ๋“ ๋‹ค.

DP[ i ] ์—๋Š” ๋งŒ๋“ค์–ด์•ผ ํ•  ๋‹จ์–ด์˜ i๋ฒˆ์งธ ์ธ๋ฑ์Šค๊นŒ์ง€ ๋งŒ๋“œ๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ์กฐ๊ฐ์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.

๋งŒ๋“ค์–ด์•ผ ํ•  ๋‹จ์–ด ๋ฌธ์ž์—ด์„ t๋ผ๊ณ  ํ•˜๊ณ , ์ด์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋‹จ์–ด ์กฐ๊ฐ์„ str์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด

t์˜ i๋ฒˆ์งธ ์ธ๋ฑ์Šค๊นŒ์ง€ ๋งŒ๋“œ๋Š”๋ฐ ํ•„์š”ํ•œ ์กฐ๊ฐ์˜ ์ˆ˜ DP[ i ] ์— ๋Œ€ํ•œ ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

DP[ i ] = min( DP[ i - str.length()] + 1 , DP[ i ] ) ์ด๋‹ค.

๋ชจ๋“  ๋‹จ์–ด ์กฐ๊ฐ str์— ๋Œ€ํ•ด ํ•ด๋‹น ์‹์ด ์„ฑ๋ฆฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

t ์˜ i - str.length() ๋ฒˆ์งธ๋ถ€ํ„ฐ i๋ฒˆ์งธ ์ธ๋ฑ์Šค๊นŒ์ง€์˜ ๋ฌธ์ž์—ด๊ณผ str์ด ์ผ์น˜ํ•  ๋•Œ๋งŒ ์œ„์˜ ์‹์ด ์„ฑ๋ฆฝํ•œ๋‹ค.

 

์•ž์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด "banana" ๋ผ๋Š” ๋ฌธ์ž์—ด์„ ๋งŒ๋“ ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ๋‹จ์–ด ์กฐ๊ฐ์—๋Š” "ban"๊ณผ "ana"๊ฐ€ ์žˆ๋‹ค,

DP[ 3 ] ์—๋Š” "ban"์„ ๋งŒ๋“œ๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ์กฐ๊ฐ์˜ ์ˆ˜๊ฐ€ ๋“ค์–ด์žˆ๋‹ค. "ban"์ด๋ผ๋Š” ์กฐ๊ฐ์ด ์žˆ๊ธฐ๋•Œ๋ฌธ์— DP[ 3 ] = 1 ์ด๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ•ด์•ผ ํ•  ๊ฐ’์€ ์ตœ์ข…์ ์œผ๋กœ DP[ 6 ]์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์ด๋‹ค.

DP[ 6 ] ์ธ ์ƒํ™ฉ์—์„œ, ๋‘ ๋‹จ์–ด์กฐ๊ฐ "ban" ๊ณผ "ana"๋ฅผ ํƒ์ƒ‰ํ•ด์•ผํ•œ๋‹ค.

์ฒซ๋ฒˆ์งธ ๋‹จ์–ด ์กฐ๊ฐ str = "ban" ์ธ ๊ฒฝ์šฐ, 6 - str.length()๋Š” 3์ด๊ณ  t์˜ 3๋ถ€ํ„ฐ 5๊นŒ์ง€์˜ ๋ฌธ์ž์—ด "ana"์™€ "ban"์„ ๋น„๊ตํ–ˆ์„ ๋•Œ, ๊ฐ™์ง€ ์•Š๋‹ค. ๋งŒ์•ฝ "ban"์„ ์ด์šฉํ•˜๋ฉด "banban" ์ด๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋‹ค.

๋‘๋ฒˆ์งธ ๋‹จ์–ด ์กฐ๊ฐ str = "ana" ์ธ ๊ฒฝ์šฐ, 6 - str.length() ๋Š” ๋˜‘๊ฐ™์ด 3์ด๊ณ  t์˜ 3๋ถ€ํ„ฐ 5๊นŒ์ง€์˜ ๋ฌธ์ž์—ด "ana" ์™€ ๋‹จ์–ด์กฐ๊ฐ "ana"๊ฐ€ ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ ์ ํ™”์‹์„ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.

DP[ 6 ] = min(DP[ 6 - str.length()] + 1, DP[ 6 ] ) ์ด๋ผ๋Š” ์‹์„ ์„ธ์šธ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ DP[ 3 ] = 1์ด๊ธฐ ๋•Œ๋ฌธ์— DP[ 6 ] = 2๊ฐ€ ๋œ๋‹ค.

 

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ for( i = 1 ~ t์˜ ๊ธธ์ด) ๊นŒ์ง€ ๋Œ๋ฉด์„œ DP[ i ] ๊ฐ’์„ ๋ชจ๋‘ ์ฑ„์›Œ์ฃผ๋ฉด ๋œ๋‹ค.

 

์ด๋•Œ ๋ฌธ์ž์—ด์„ ๋น„๊ตํ• ๋•Œ ' == ' ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ compare ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ๋ฐ›๋Š”๋‹ค. ๋‘ ๋ฌธ์ž์—ด์„ ๋น„๊ตํ•˜๋Š” ๊ณผ์ •์—์„œ ์‹œ๊ฐ„์ด ๋งŽ์ด ๋“œ๋Š” ๋“ฏ ํ•˜๋‹ค.

๊ทธ๋ƒฅ ๋ฌธ์ž ํ•˜๋‚˜ํ•˜๋‚˜ ๋น„๊ตํ•˜๋Š” ๊ฒŒ ๋” ์‹œ๊ฐ„์ ์ธ ๋ฉด์—์„œ ๋” ํšจ์œจ์ ์ด๋‹ค.

 

์ฝ”๋“œ ์ž‘์„ฑ
 
#include <bits/stdc++.h>
using namespace std;
#define INF 20000 + 5
const int MAX_N = 20000 + 5;
vector<int> DP(MAX_N, INF);
 
int solution(vector<string> strs, string t)
{
    int answer = 0;
    DP[0= 0;
    for(int i = 1; i <= t.length(); i++){
        for(auto str : strs){
            if(i < str.length())
                continue;
            if(DP[i - str.length()] == INF)
                continue;
            
            bool chk = true;
            for(int j = 0; j<str.length(); j++){
                if(t[i - str.length() + j] != str[j]){ //๋ฌธ์ž์—ด ๋น„๊ต
                    chk = false;
                    break;
                }
            }
            //string temp = t.substr(i - str.length(), str.length());
            //if(!str.compare(temp))
            if(chk)
                DP[i] = min(DP[i], DP[i - str.length()] + 1);
        }
    }
    
    if(DP[t.length()] == INF)
        answer = -1;
    else answer = DP[t.length()];
    
    return answer;
}
cs

๋ฌธ์ž์—ด์„ ๋งŒ๋“œ๋Š” ๋ฐ์—๋„ DP๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑธ ์•Œ๊ฒŒ๋๋‹ค.

DP ๋ฌธ์ œ๋Š” ์–ธ์ œ๋‚˜ ์–ด๋ ต๋‹ค. ํŒŒ์ดํŒ…

728x90