์ธ๋ฒฝ ์ ๊ฒ
๋ฌธ์
https://programmers.co.kr/learn/courses/30/lessons/60062#
๋ฌธ์ ์ค๋ช
๋ ์คํ ๋์ ์ด์ํ๊ณ ์๋ ์ค์นดํผ๋ ๋ ์คํ ๋ ๋ด๋ถ๊ฐ ๋๋ฌด ๋ก์ ์น๊ตฌ๋ค๊ณผ ํจ๊ป ์ง์ ๋ฆฌ๋ชจ๋ธ๋ง ํ๊ธฐ๋ก ํ์ต๋๋ค. ๋ ์คํ ๋์ด ์๋ ๊ณณ์ ์ค๋ ธ์ฐํ์ด์ผ๋ก ๋งค์ฐ ์ถ์ด ์ง์ญ์ด์ด์ ๋ด๋ถ ๊ณต์ฌ๋ฅผ ํ๋ ๋์ค์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ธ๋ฒฝ์ ์ํ๋ฅผ ์ ๊ฒํด์ผ ํ ํ์๊ฐ ์์ต๋๋ค.
๋ ์คํ ๋์ ๊ตฌ์กฐ๋ ์์ ํ ๋๊ทธ๋ ๋ชจ์์ด๊ณ ์ธ๋ฒฝ์ ์ด ๋๋ ๋ n๋ฏธํฐ์ด๋ฉฐ, ์ธ๋ฒฝ์ ๋ช๋ช ์ง์ ์ ์ถ์๊ฐ ์ฌํ ๊ฒฝ์ฐ ์์๋ ์๋ ์๋ ์ทจ์ฝํ ์ง์ ๋ค์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ด๋ถ ๊ณต์ฌ ๋์ค์๋ ์ธ๋ฒฝ์ ์ทจ์ฝ ์ง์ ๋ค์ด ์์๋์ง ์์๋ ์ง, ์ฃผ๊ธฐ์ ์ผ๋ก ์น๊ตฌ๋ค์ ๋ณด๋ด์ ์ ๊ฒ์ ํ๊ธฐ๋ก ํ์ต๋๋ค. ๋ค๋ง, ๋น ๋ฅธ ๊ณต์ฌ ์งํ์ ์ํด ์ ๊ฒ ์๊ฐ์ 1์๊ฐ์ผ๋ก ์ ํํ์ต๋๋ค. ์น๊ตฌ๋ค์ด 1์๊ฐ ๋์ ์ด๋ํ ์ ์๋ ๊ฑฐ๋ฆฌ๋ ์ ๊ฐ๊ฐ์ด๊ธฐ ๋๋ฌธ์, ์ต์ํ์ ์น๊ตฌ๋ค์ ํฌ์ ํด ์ทจ์ฝ ์ง์ ์ ์ ๊ฒํ๊ณ ๋๋จธ์ง ์น๊ตฌ๋ค์ ๋ด๋ถ ๊ณต์ฌ๋ฅผ ๋๋๋ก ํ๋ ค๊ณ ํฉ๋๋ค. ํธ์ ์ ๋ ์คํ ๋์ ์ ๋ถ ๋ฐฉํฅ ์ง์ ์ 0์ผ๋ก ๋ํ๋ด๋ฉฐ, ์ทจ์ฝ ์ง์ ์ ์์น๋ ์ ๋ถ ๋ฐฉํฅ ์ง์ ์ผ๋ก๋ถํฐ ์๊ณ ๋ฐฉํฅ์ผ๋ก ๋จ์ด์ง ๊ฑฐ๋ฆฌ๋ก ๋ํ๋ ๋๋ค. ๋, ์น๊ตฌ๋ค์ ์ถ๋ฐ ์ง์ ๋ถํฐ ์๊ณ, ํน์ ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ์ธ๋ฒฝ์ ๋ฐ๋ผ์๋ง ์ด๋ํฉ๋๋ค.
์ธ๋ฒฝ์ ๊ธธ์ด n, ์ทจ์ฝ ์ง์ ์ ์์น๊ฐ ๋ด๊ธด ๋ฐฐ์ด weak, ๊ฐ ์น๊ตฌ๊ฐ 1์๊ฐ ๋์ ์ด๋ํ ์ ์๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ด๊ธด ๋ฐฐ์ด dist๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ทจ์ฝ ์ง์ ์ ์ ๊ฒํ๊ธฐ ์ํด ๋ณด๋ด์ผ ํ๋ ์น๊ตฌ ์์ ์ต์๊ฐ์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
- n์ 1 ์ด์ 200 ์ดํ์ธ ์์ฐ์์ ๋๋ค.
- weak์ ๊ธธ์ด๋ 1 ์ด์ 15 ์ดํ์
๋๋ค.
- ์๋ก ๋ค๋ฅธ ๋ ์ทจ์ฝ์ ์ ์์น๊ฐ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ฃผ์ด์ง์ง ์์ต๋๋ค.
- ์ทจ์ฝ ์ง์ ์ ์์น๋ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์ฃผ์ด์ง๋๋ค.
- weak์ ์์๋ 0 ์ด์ n - 1 ์ดํ์ธ ์ ์์ ๋๋ค.
- dist์ ๊ธธ์ด๋ 1 ์ด์ 8 ์ดํ์
๋๋ค.
- dist์ ์์๋ 1 ์ด์ 100 ์ดํ์ธ ์์ฐ์์ ๋๋ค.
- ์น๊ตฌ๋ค์ ๋ชจ๋ ํฌ์ ํด๋ ์ทจ์ฝ ์ง์ ์ ์ ๋ถ ์ ๊ฒํ ์ ์๋ ๊ฒฝ์ฐ์๋ -1์ return ํด์ฃผ์ธ์.
์ ์ถ๋ ฅ ์
n | weak | dist | result |
---|---|---|---|
12 | [1, 5, 6, 10] | [1, 2, 3, 4] | 2 |
12 | [1, 3, 4, 9, 10] | [3, 5, 7] | 1 |
์ ์ถ๋ ฅ ์์ ๋ํ ์ค๋ช
์ ์ถ๋ ฅ ์ #1
์ํ ๋ ์คํ ๋์์ ์ธ๋ฒฝ์ ์ทจ์ฝ ์ง์ ์ ์์น๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์น๊ตฌ๋ค์ ํฌ์ ํ๋ ์์ ์ค ํ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- 4m๋ฅผ ์ด๋ํ ์ ์๋ ์น๊ตฌ๋ 10m ์ง์ ์์ ์ถ๋ฐํด ์๊ณ๋ฐฉํฅ์ผ๋ก ๋์ 1m ์์น์ ์๋ ์ทจ์ฝ ์ง์ ์์ ์ธ๋ฒฝ ์ ๊ฒ์ ๋ง์นฉ๋๋ค.
- 2m๋ฅผ ์ด๋ํ ์ ์๋ ์น๊ตฌ๋ 4.5m ์ง์ ์์ ์ถ๋ฐํด 6.5m ์ง์ ์์ ์ธ๋ฒฝ ์ ๊ฒ์ ๋ง์นฉ๋๋ค.
๊ทธ ์ธ์ ์ฌ๋ฌ ๋ฐฉ๋ฒ๋ค์ด ์์ง๋ง, ๋ ๋ช ๋ณด๋ค ์ ์ ์น๊ตฌ๋ฅผ ํฌ์ ํ๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์น๊ตฌ๋ฅผ ์ต์ ๋ ๋ช ํฌ์ ํด์ผ ํฉ๋๋ค.
์ ์ถ๋ ฅ ์ #2
์ํ ๋ ์คํ ๋์์ ์ธ๋ฒฝ์ ์ทจ์ฝ ์ง์ ์ ์์น๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
7m๋ฅผ ์ด๋ํ ์ ์๋ ์น๊ตฌ๊ฐ 4m ์ง์ ์์ ์ถ๋ฐํด ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ์ ๊ฒ์ ๋๋ฉด ๋ชจ๋ ์ทจ์ฝ ์ง์ ์ ์ ๊ฒํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์น๊ตฌ๋ฅผ ์ต์ ํ ๋ช ํฌ์ ํ๋ฉด ๋ฉ๋๋ค.
์ฝ๋
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
unordered_map<string, int> memo;
string makeKeyString(vector<int>& weak, vector<int>& dist){
// ๋ฉ๋ชจ์ด์ ์ด์
์ ์ํ key ์์ฑ ํจ์
string s;
for(int i=0; i<weak.size(); i++){
s += to_string(weak[i]);
s += "/"; // ๊ตฌ๋ถ์
}
s+=":"; // ๊ตฌ๋ถ์
for(int i=0; i<dist.size(); i++){
s += to_string(dist[i]);
s += "/"; // ๊ตฌ๋ถ์
}
return s;
}
int memoReturn(string s){
// ๋ฉ๋ชจ์ด์ ์ด์
๊ฒฐ๊ณผ return
if(memo.find(s)!=memo.end())
return memo[s];
else
return -1;
}
int module(int n, vector<int>& weak, vector<int> dist) {
// ํ์ฌ weak์ dist์์ ์ต์๋ก ์๋ฆฌํ ์ ์๋ ์ธ์์๋ฅผ return ํ๋ ํจ์
if (weak.size() == 0) // weak๊ฐ ๋์ด์ ์์ผ๋ฉด 0
return 0;
if (dist.size() == 0) // weak๊ฐ ์๋๋ฐ dist๊ฐ ์์ผ๋ฉด ๋ถ๊ฐ๋ฅ (์ต๋๊ฐ return)
return 1e9;
if (weak.size() == 1) // dist๊ฐ ์๋๋ฐ weak๊ฐ 1๊ฐ ๋จ์์ผ๋ฉด ๋ฐ๋ก ํด๊ฒฐ ๊ฐ๋ฅ
return 1;
int biggest = dist[dist.size() - 1]; // ๊ฐ์ฅ ํฐ dist๋ฅผ ๋ฐ์์ด
dist.pop_back();
int mod = n;
int min = 1e8; // 1 ๋ํด์ฃผ๋ ๊ฒ ๋๋ฌธ์ 1e9๋ก ์ฒ๋ฆฌํ๋ฉด overflow => ใ
ใ
for (int i = 0; i<weak.size(); i++) {
int start = weak[i];
int end = weak[i] + biggest; end %= mod; // end๊ฐ n๋ณด๋ค ์ปค์ง๋ ๊ฒ ๋ฐฉ์ง
vector<int> tmpWeak(weak);
bool over = false;
if (start > end) {
over = true;
}
for (int i = tmpWeak.size()-1; i >= 0; i--) { // ๊ฐ ์ ์๋ ๋ฒ์ ๋ด์ weak ์์ ๊ธฐ
if (over) {
if (start <= tmpWeak[i] || end >= tmpWeak[i])
tmpWeak.erase(tmpWeak.begin() + i);
}
else {
if (start <= tmpWeak[i] && end >= tmpWeak[i])
tmpWeak.erase(tmpWeak.begin() + i);
}
}
int tmp;
string s_tmp = makeKeyString(tmpWeak, dist); // ํค ์์ฑ
int tmpMemo = memoReturn(s_tmp); // memo์ ์๋์ง ํ์ธ
if(tmpMemo!=-1)
tmp = tmpMemo; // ์์ผ๋ฉด ์ฌ์ฉ
else{
tmp = module(n, tmpWeak, dist);
memo[s_tmp] = tmp; // ์์ผ๋ฉด ๊ณ์ฐ ํ memo์ ์ ์ฅ
}
if (min>tmp)
min = tmp;
}
return min+1; // ์ฒ์ dist ์ฌ์ฉํ ๊ฒ ๊ณ ๋ คํด์ 1 ๋ํด์ฃผ๊ธฐ
}
int solution(int n, vector<int> weak, vector<int> dist) {
sort(dist.begin(), dist.end());
int answer = module(n, weak, dist);
if(answer>=1e8) // ๋ง์ฝ ๋ถ๊ฐ๋ฅํ๋ฉด
answer = -1;
return answer;
}
ํ์ด
์ฒ์์ input ๊ฐ์ด ์ ์ ๊ฑธ ์๊ฐํ์ง ๋ชปํ๊ณ , ์กฐ๊ฑด์ ๋ง์ถฐ ํ๋ค๊ฐ ๋ํต ๋นํ๋ค ใ ใ ใ input ๊ฐ์ด ์ ๊ณ ์กฐ๊ฑด์ด ๋๋ฌด ๋ง์์ ๊ณ ๋ คํ๊ธฐ ํ๋ค๋ฉด ์์ ํ์ + ์๋๊ฐ์ ๋ฐฉ๋ฒ(DP, ๋ฉ๋ชจ์ด์ ์ด์ , ์ฌ๊ท ์กฐ๊ฑด)๋ฅผ ์๊ฐํด๋ณด์.
์ฌ๊ท๋ฅผ ์ด์ฉํ์ฌ, ํ์ฌ dist๋ก๋ถํฐ weak๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ํ์ํ ์ต์ ์ธ์์๋ฅผ return ํ๋ ์์ผ๋ก ๋์์ํค๋ฉด ๋๋ค.
- ์์ ํ์์ผ๋ก dist๋ฅผ ์ต๋ ๊ฐ๋ถํฐ ์ฌ์ฉํ๋ค.
- ํด๋น dist๋ก ๊ฐ ์ ์๋ ๋ฒ์๋ฅผ ๊ฐ weak ์ง์ ์ ๋ํด์ ์ดํด๋ณธ๋ค.
- ํด๋น ๋ฒ์์ ์๋ weak ์ง์ ๋ค์ ์ ๊ฑฐํ๋ค.
- ๋จ์ weak์ dist๋ฅผ ์ฌ๊ท๋ก ๋๊ฒจ 1๋ฒ๋ถํฐ ๋ค์ ์ ์ฉํ๋ค.
์ด๋ ๊ฒ ์ฌ๊ท ๋จ๊ณ๋ฅผ ๋ฐ๋ผ๊ฐ๋ดค์ ๋, ๋ค์ ๋จ๊ณ๋ก ๊ฐ๋ ๊ฒฝ์ฐ์ ์๋ ๊ฐ ์ ์๋ weak์ ์์ด๋ค. ๋ฐฉํฅ์ ์๊ณ, ๋ฐ์๊ณ ๋ฐฉํฅ์ ์ ํํ ์ ์์ง๋ง ํ ๋ฐฉํฅ์ผ๋ก ๊ณ ์ ํ๋ฉด ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฒดํฌํ ์ ์์ผ๋ฏ๋ก ์๊ณ๋ฐฉํฅ์ผ๋ก ๊ณ ์ ํ๋ค. weak์ ์๋ ์ ๋ ฅ๊ฐ์์ ์ฃผ์ด์ก๋ฏ ์ต๋ 15์ด๋ฏ๋ก ํ ๋จ๊ณ์์ ๋ป์ด๋์ค๋ ๊ฐ์ง์ ์๋ ์ต๋ 15๊ฐ์ด๋ค.
๋ํด์ weak๊ฐ ํ ๋จ๊ณ์ ์ต์ ํ๋์ฉ ์ฌ๋ผ์ง๋ค๊ณ ์ต์ ์ผ๋ก ๊ฐ์ ํ๋ฉด ์ต๋ 15 ๊น์ด๊ฐ ๋์ค๋ฏ๋ก, 15^15๋ผ๋ ์๊ฐ๋ณต์ก๋๊ฐ ๋์จ๋ค.
์ด๋ ๋๋ฌด ํฐ ์๊ฐ๋ณต์ก๋ ์ด๋ฏ๋ก ์ฌ๊ท์์ ๊ฒน์น๋ ๋ถ๋ถ์ ์ค์ด๋ ๋ฐฉ์์ผ๋ก ์๊ฐ๋ณต์ก๋๋ฅผ ๋ฎ์ถฐ์ผํ๋๋ฐ, '๋ฉ๋ชจ์ด์ ์ด์ '์ ์ฌ์ฉํ์๋ค. ํด๋น ๋ฌธ์ ์์ ๊ฒน์น๋ ๋ถ๋ถ์ ํ๋จํ๋ ๊ธฐ์ค์ dist์ weak์ด๋ค.
dist์ weak๊ฐ ๊ฐ์ module function์ ๋ฐ๋ณตํ ํ์์์ด ์ด์ ๊ฐ๊ณผ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ฏ๋ก dist์ weak๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
๋ ๋ค vector<int>
์ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ์ด์ ์ด์
์ ์ฉ์ดํ๋๋ก ๊ตฌ๋ถ์๋ฅผ ์ด์ฉํ์ฌ string์ผ๋ก ๋ง๋ค์ด์ค ํ์ map์ผ๋ก ๋ฉ๋ชจ์ด์ ์ด์
์ ๊ตฌํํด์ฃผ์๋ค.
์ฑ์ ๊ฒฐ๊ณผ
๋ค๋ฅธ ์ฌ๋์ ํ์ด
- ์์ด์ ์ด์ฉํด์ ํธ๋ ๊ฒ์ด ๋ ๋น ๋ฅด๋ค.
Comment