๋ฌธ์ ๋งํฌ
https://school.programmers.co.kr/learn/courses/30/lessons/12983
์์ฑ์์ผ์ผ ํ ๋จ์ด์ ๋จ์ด ์กฐ๊ฐ๋ค์ด ์ฃผ์ด์ก์ ๋, ์ํ๋ ๋จ์ด๋ฅผ ์์ฑ์ํค๊ธฐ ์ํด ํ์ํ ๋จ์ด ์กฐ๊ฐ์ ์์ ์ต์๊ฐ์ ๋ฆฌํดํ์.
ํ์ด
- ๋์ ์ฒ์ ์ ๊ทผ๋ฐฉ์
๋๋ ์ผ๋จ ํน๋ณํ ๋ฐฉ๋ฒ์ด ๋ ์ค๋ฅด์ง ์๋ ํ, ์ผ๋จ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ง๋ค์ด๋ณด๋ ๋ฐฉ์์ ํํ๋ค.
๋ฐฑํธ๋ํน์ ํตํด์ ๋จ์ด ์กฐ๊ฐ๋ค์ ์ด์ด๋ถ์ฌ์ ๋จ์ด๋ฅผ ๋ง๋ค์ด๊ฐ๋ ๋ฐฉ์์ด๋ค.
๋ง๋ค์ด์ง ๋จ์ด์ ๊ธธ์ด๊ฐ ๋ง๋ค๊ณ ์ถ์ ๋จ์ด์ ๊ธธ์ด๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์์ก์ ๋๋ ์ด์ ๋น๊ต๋ฅผ ํ๊ณ ๋ฆฌํด์ ํด์ฃผ์ด์ผํ๋ค.
๋ง์ฝ ๋ง๋ค์ด์ง ๋จ์ด์ ๊ธธ์ด๊ฐ ๋ง๋ค๊ณ ์ถ์ ๋จ์ด์ ๊ธธ์ด๋ณด๋ค ๊ธธ๋ค๋ฉด ๋น๊ต ํ ํ์๋ ์์ด ๊ฐ์ง ์์ ๋จ์ด๋ค.
๋ง๋ค์ด์ง ๋จ์ด์ ๋ง๋ค์ด์ผ ํ ๋จ์ด๊ฐ ๊ฐ๋ค๋ฉด? ์ด๋ ์ฌ์ฉ๋ ์กฐ๊ฐ์ ๊ฐ์๋ฅผ ํ์ฌ 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 ๋ฌธ์ ๋ ์ธ์ ๋ ์ด๋ ต๋ค. ํ์ดํ
'ํ๋ก๊ทธ๋๋จธ์ค > 4๋จ๊ณ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค Lv4] : ๋ฌด์ง์ ๋จน๋ฐฉ ๋ผ์ด๋ธ (0) | 2022.07.13 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค Lv4] : ๊ฐ์ฌ ๊ฒ์ (0) | 2022.07.12 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv4] : ์งํ ์ด๋ (0) | 2022.07.11 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv4] : ๋๋์ง (0) | 2022.06.29 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv4] : ์ง๊ฒ๋ค๋ฆฌ (0) | 2022.06.21 |