2024 BOJ STUDY
์งํ ๊ธฐ๊ฐ : 2024-01-14 ~ 2024-05-08
- 2์ฃผ์ฐจ๋ถํฐ ๋ธ๋ก๊ทธ๋ก ํฌ์คํ ์์
- 3์ฃผ์ฐจ๋ถํฐ github๋ก ๊ด๋ฆฌ
- 6์ฃผ์ฐจ๋ถํฐ๋ ํ์ Review๋ ์๋ต
- pr๋ณด๋ฉด์ ๋ฆฌ์บกํ๋๊ฒ ๋ ์ข์
โฏ g++ --version
Apple clang version 15.0.0 (clang-1500.1.0.2.5)
Target: arm64-apple-darwin23.2.0
Thread model: posix
# compile
โฏ g++ -g -Wall -std=c++17 -o <file_name> <file_name>.cpp
Content
- 16์ฃผ์ฐจ
- 15์ฃผ์ฐจ
- 14์ฃผ์ฐจ
- 13์ฃผ์ฐจ
- 12์ฃผ์ฐจ
- 11์ฃผ์ฐจ
- 10์ฃผ์ฐจ
- 9์ฃผ์ฐจ
- 8์ฃผ์ฐจ
- 7์ฃผ์ฐจ : Dijkstra
- 6์ฃผ์ฐจ : Implementation
- 5์ฃผ์ฐจ : DP
- 4์ฃผ์ฐจ : Greedy
- 3์ฃผ์ฐจ : ์ด๋ถํ์
- 2์ฃผ์ฐจ : BFS
16์ฃผ์ฐจ
๋ชฉ์ฐจ
- ME
- ํ์
5639. ์ด์ง ๊ฒ์ ํธ๋ฆฌ
๋ฌธ์ ์์ฝ
์ด์ง ๊ฒ์ ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์์ ๋ง์กฑํ๋ค.
- ๋ ธ๋์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์๋ ๋ชจ๋ ๋ ธ๋์ ํค๋ ๋ ธ๋์ ํค๋ณด๋ค ์๋ค.
- ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ์๋ ๋ชจ๋ ๋ ธ๋์ ํค๋ ๋ ธ๋์ ํค๋ณด๋ค ํฌ๋ค.
- ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ ์ด์ง ๊ฒ์ ํธ๋ฆฌ์ด๋ค.
์ ์ ์ํ (๋ฃจํธ - ์ผ์ชฝ - ์ค๋ฅธ์ชฝ)๋ก ๋ฐฉ๋ฌธํ ๊ฒฐ๊ณผ๊ฐ ์ฃผ์ด์ก์ ๋,
ํ์ ์ํ (์ผ์ชฝ - ์ค๋ฅธ์ชฝ - ๋ฃจํธ)๋ก ๋ฐฉ๋ฌธํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด๋ณด์.

(์์ ์ ๋ ฅ)
50
30
24
5
28
45
98
52
60
ํด์ค & ์ ์ฒด ์ฝ๋
์ ์ ์ํ๊ฐ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๊ธฐ ๋๋ฌธ์ ๋งจ์ฒ์ ์ ๋ ฅ์ด ๋ฃจํธ์ด๋ค.
์์ ๊ธฐ์ค์ผ๋ก, 50๋ณด๋ค ์์ ์ ๋ ฅ์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ด๋ค.
๋ฃจํธ: 50, ์ผ์ชฝ: [30, 24, 5, 28, 45], ์ค๋ฅธ์ชฝ: [98, 52, 60]
์ด ํ์๋ฅผ ๊ฐ ์๋ธํธ๋ฆฌ๋ง๋ค ์ฌ๊ท์ ์ผ๋ก ๋ฐ๋ณตํ๋ฉด ๋๋ ๋ฌธ์ ์ด๋ค.
#include <iostream>
#include <vector>
using namespace std;
vector<int> v;
void recur(int s, int e) {
if (s >= e) return;
// NOTE : ๋
ธ๋๊ฐ 1๊ฐ๋ผ๋ฉด ๊ทธ๋ฅ ํ์ํ๋ฉด ๋๋ค
if (s == e-1) {
cout << v[s] << '\n';
return;
}
int idx = s+1;
// NOTE : ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ํด๋นํ๋ ์ธ๋ฑ์ค ๋ฒ์๋ฅผ ์ฐพ๋๋ค
while (idx < e) {
if (v[s] < v[idx]) break;
++idx;
}
// NOTE : ํ์ ์ํ : ์ผ์ชฝ - ์ค๋ฅธ์ชฝ - ๋ฃจํธ
recur(s+1, idx); recur(idx, e); cout << v[s] << '\n';
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int x;
while (cin >> x) { v.push_back(x); }
recur(0, v.size());
return 0;
}
1915. ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ
๋ฌธ์ ์์ฝ
n x m ์ 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋ค.
์ด๋, 1๋ก ๋ ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ณด์.

(์์ ์ ๋ ฅ)
4 4 => n, m
0100
0111
1110
0010
ํด์ค & ์ ์ฒด ์ฝ๋

์ข์๋จ 0,0 ๋ถํฐ ๋ด๋ ค๊ฐ๋ฉฐ 2์ฐจ์ ๋ฐฐ์ด์ ์กฐ์ฌํ๋๋ฐ,
0์ด ์๋ ๊ฐ์ ๋ํด์๋ง ์ฃผ๋ชฉํ๋ค.
0์ด๋ฉด ์ ์ด์ ์ ์ฌ๊ฐํ์ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ dp๋ฅผ ์ ์ฉํ๋ค.
์ฐ์ธกํ๋จ ๊ผญ์ง์ ์ ๊ธฐ์ค์ผ๋ก,
์ผ์ชฝ, ์์ชฝ, ์ผ์ชฝ์๋จ ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์ ์ฌ๊ฐํ์ด ๋ง๋ค์ด์ง๋์ง ํ์ธํ๋ค.
ํ์ธํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
map[i][j] = min(map[i-1][j], min(map[i][j-1], map[i-1][j-1])) + 1;
3๊ฐ์ ๋ฐฉํฅ ์ค ๊ฐ์ฅ ์์ ๊ฐ์ ์ ํํด
1์ ๋ํด์ฃผ๋ฉด ๋๋ค. (ํ์ฌ 0์๋ i, j ์์ ๋ง๋ค ์ ์๋ ์ ์ฌ๊ฐํ์ ์ต๋ ํฌ๊ธฐ)
#include <iostream>
using namespace std;
#define MAX 1001
int n,m;
int map[MAX][MAX];
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> n >> m;
char c;
for (int i=1; i<=n; ++i) {
for (int j=1; j<=m; ++j) {
cin >> c;
map[i][j] = c - '0';
}
}
int ans = 0;
for (int i=1; i<=n; ++i) {
for (int j=1; j<=m; ++j) {
if (map[i][j] == 0) continue;
map[i][j] = min(
map[i-1][j],
min(map[i][j-1], map[i-1][j-1])
) + 1;
ans = max(ans , map[i][j]);
}
}
cout << ans*ans;
return 0;
}
Review
2212. ์ผ์
17609. ํ๋ฌธ
2293. ๋์ 1
21608. ์์ด ์ด๋ฑํ๊ต
1941. ์๋ฌธ๋ ์น ๊ณต์ฃผ
15486. ํด์ฌ 2
15์ฃผ์ฐจ
๋ชฉ์ฐจ
- ME
- ํ์
1715. ์นด๋ ์ ๋ ฌํ๊ธฐ
๋ฌธ์ ์์ฝ
์ซ์ ์นด๋ ๋ฌถ์๋ค์ด ์ฑ ์ ์์ ๋์ฌ ์๋ค.
๋ ๋ฌถ์์ฉ ๊ณจ๋ผ ์๋ก ํฉ์ณ๋๊ฐ๋ค๊ณ ํ์ ๋,
๊ณ ๋ฅด๋ ์์์ ๋ฐ๋ผ์ ๋น๊ต ํ์๊ฐ ๋ฌ๋ผ์ง๋ค.
์๋ฅผ ๋ค์ด, [10์ฅ, 20์ฅ, 40์ฅ] ์ ์นด๋ ๋ฌถ์์ด ์๋ค๊ณ ํ์.
- 10, 20์ ๋จผ์ ํฉ์น๋ ๊ฒฝ์ฐ
- 10 + 20 => 30, 30 + 40 => 70
- ์ด 30 + 70 = 100๋ฒ ์ ๋น๊ต๊ฐ ํ์ํ๋ค.
- 20, 40์ ๋จผ์ ํฉ์น๋ ๊ฒฝ์ฐ
- 20 + 40 => 60, 10 + 60 => 70
- ์ด 60 + 70 = 130๋ฒ ์ ๋น๊ต๊ฐ ํ์ํ๋ค.
- 10, 40์ ๋จผ์ ํฉ์น๋ ๊ฒฝ์ฐ
- 10 + 40 => 50, 50 + 20 => 70
- ์ด 50 + 70 = 120๋ฒ ์ ๋น๊ต๊ฐ ํ์ํ๋ค.
N ๊ฐ์ ์ซ์ ์นด๋ ๋ฌถ์์ ๊ฐ๊ฐ ํฌ๊ธฐ๊ฐ ์ฃผ์ด์ง๋ค๊ณ ํ์ ๋,
์ต์ ๋ช ๋ฒ์ ๋น๊ต๊ฐ ํ์ํ์ง ๊ตฌํด๋ณด์.
(์์ ์ ๋ ฅ)
3 => ์นด๋ ๋ฌถ์์ ๊ฐ์ N
10
20
40
ํด์ค & ์ ์ฒด ์ฝ๋
- ๊ทธ๋ฆฌ๋
- ์ฐ์ ์์ ํ
์ ๋ฐฉ์์ผ๋ก ํด๊ฒฐ๊ฐ๋ฅํ ๋ฌธ์ ์๋ค.
ํฉ์ณ์ง ์นด๋ ๋ฌถ์๋ค์ ๋ค์ ๋ฒ์๋ ๊ณ์ ๋น๊ต๋์์ด ๊ฐ๋ฅํ๋ฏ๋ก,
์ด ํฌ๊ธฐ๋ฅผ ์ด๋ฐ๋ถํฐ ์ต์๋ก ๋ง๋ค์ด ๋์์ผ
๊ฒฐ๊ณผ์ ์ผ๋ก ์ต์ ๋น๊ต ํ์๋ฅผ ์ป์ ์ ์๋ค.
์ฆ, ์นด๋ ์ฅ์์ ๋ํ ์ต์ํ์ ๋ง๋ค๊ณ
๋ง๋ ์นด๋ ๋ฌถ์์ ๋ค์ ์ฐ์ ์์ ํ์ ๋ฃ์ผ๋ฉด ๋๋ ๋ฌธ์ ์๋ค.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
using ll = long long;
int N;
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N;
// NOTE : ์ต์ํ
priority_queue<ll, vector<ll>, greater<ll>> pq;
for (int i=0; i<N; ++i) {
ll x; cin >> x; pq.push(x);
}
ll ans = 0;
while (pq.size() > 1) {
ll t1 = pq.top(); pq.pop();
ll t2 = pq.top(); pq.pop();
ans += t1+t2;
pq.push(t1+t2);
}
cout << ans;
return 0;
}
1744. ์ ๋ฌถ๊ธฐ
๋ฌธ์ ์์ฝ
๊ธธ์ด๊ฐ N์ธ ์์ด์ด ์ฃผ์ด์ก์ ๋ ์ด ์์ด์ ํฉ์ ๊ตฌํ๋ค.
๋จ, ์ผ๋ฐ์ ์ธ ํฉ์ ๊ตฌํ๋ ๊ฒ์ด ์๋๋ผ
์์ด์ ๋ ์๋ฅผ ๋ฌถ๋ ๊ฒ์ ํ์ฉํ์ ๋์ ํฉ์ ๊ตฌํ๋ค.
๋ฌถ๋๋ค := ์ด๋ค ์๋ฅผ ๋ฌถ๊ฒ ๋๋ฉด ์๋ก ๊ณฑํ ํ์ ๋ํ๋ค
์ด๋ค ์์ด์ด [0, 1, 2, 4, 3, 5] ์ผ ๋
- ์ผ๋ฐ์ ์ธ ํฉ
- 0, 1, 2, 3, 4, 5 => 0 + 1 + 2 + 3 + 4 + 5 = 15
- 2์ 3, 4์ 5๋ฅผ ๋ฌถ๋ ๊ฒฝ์ฐ
- 0 + 1 + (2 X 3) + (4 X 5) = 27 ==> ์ต๋
๊ฐ ์๋ ์๊ธฐ ์์ ๊ณผ ๋ฌถ์ผ ์ ์์ผ๋ฉฐ,
๋จ ํ๋ฒ๋ง ๋ฌถ์ผ ์ ์๊ฑฐ๋ ๋ฌถ์ด์ง ์์์ผํ๋ค.
์ด๋ ํฉ์ด ์ต๋๊ฐ ๋๊ฒ ํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ณด์.
(์์ ์ ๋ ฅ)
4 => ์์ด์ ๊ธธ์ด N
-1
2
1
3
ํด์ค & ์ ์ฒด ์ฝ๋
์์๋ ์์๋ผ๋ฆฌ, ์์๋ ์์๋ผ๋ฆฌ ๋ฌถ์ด์ ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
์์ ๋ฐฐ์ด์ ๋ด๋ฆผ์ฐจ์์ผ๋ก, ์ ๋ ฌํ์ฌ ๊ณฑํด์ฃผ๊ธฐ๋ง ํ๋ฉด๋๋ค.
์์ ์ฒ๋ฆฌ๊ฐ ์ฝ๊ฐ ๊ณ ๋ คํด์ผํ ๊ฒ์ด ์๋๋ฐ,
1์ ์กด์ฌ ๋๋ฌธ์ด๋ค.
1์ด ์กด์ฌํ ๊ฒฝ์ฐ ๋ฌถ์ง๋ง๊ณ ๋ํ๋ ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผํ๋ค.
์ด๊ฒ๋ง ์ฃผ์ํ๋ฉด ๋๋ ๋ฌธ์ ์๋ค.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N;
vector<int> Minus, Plus;
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N;
for (int i=0; i<N; ++i) {
int x; cin >> x;
if (x <= 0) Minus.push_back(x);
else Plus.push_back(x);
}
sort(Minus.begin(), Minus.end(), less<int>());
sort(Plus.begin(), Plus.end(), greater<int>());
int ans = 0;
// NOTE : ์ง์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ํ์ ๊ธธ์ด์ธ ๊ฒฝ์ฐ ๋ง์ง๋ง ์์๋ฅผ ๋ฏธ๋ฆฌ ์ถ๊ฐ
if (Minus.size() & 1) ans += Minus.back();
for (int i=0; i< (int)Minus.size()-1; i+=2) {
ans += Minus[i] * Minus[i+1];
}
if (Plus.size() & 1) ans += Plus.back();
for (int i=0; i< (int)Plus.size()-1; i+=2) {
// NOTE : 1์ผ ๊ฒฝ์ฐ ๋ํ๋ ๊ฒ์ด ๋ ํฌ๋ค
if (Plus[i+1] == 1) ans += Plus[i] + Plus[i+1];
else ans += Plus[i] * Plus[i+1];
}
cout << ans;
return 0;
}
Review
1939. ์ค๋์ ํ
1956. ์ด๋
21610. ๋ง๋ฒ์ฌ ์์ด์ ๋น๋ฐ๋ผ๊ธฐ
1943. ๋์ ๋ถ๋ฐฐ
20366. ๊ฐ์ด ๋์ฌ๋ ๋ง๋ค๋?
5022. ์ฐ๊ฒฐ
14์ฃผ์ฐจ
๋ชฉ์ฐจ
- ME
- ํ์
1339. ๋จ์ด ์ํ
๋ฌธ์ ์์ฝ
์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ง ๋จ์ด N๊ฐ๊ฐ ์ฃผ์ด์ง๋ค.
๊ฐ๊ฐ์ ์ํ๋ฒณ์ 0~9 ์ฌ์ด์ ์ซ์๋ก ๋ฐ๊ฟ์ N๊ฐ์ ์๋ฅผ ํฉํ๋๋ฐ,
์ด๋ ์์ ํฉ์ด ์ต๋๊ฐ ๋๋๋ก ๋ฐ๊พธ๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
์๋ฅผ ๋ค์ด,
GCF + ACDEB = 99437
๋ฅผ ๊ณ์ฐํ๋ค๊ณ ํ์ ๋
- G:9, C:7, F:6, A:5, D:4, E:3, B:2
๋ก ๋ฐ๊พธ๋ฉด ์ต๋๊ฐ ๋๋ค.
(์์ ์ ๋ ฅ)
2 => ๋จ์ด์ ๊ฐ์ N
AAA
AAA
ํด์ค & ์ ์ฒด ์ฝ๋
๊ทธ๋ฆฌ๋๋ก ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ์๋ค.
๊ฐ์ธ์ ์ผ๋ก๋ ๊ทธ๋ฆฌ๋์ ๋ํ ์ ์๋ฅผ ์๋ชป ์ธ์์ ํจ์ค์ํค๋๋ฐ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค.
- ๋ ๋ง์ด ์ ์๋ฆฌ์ ์์น
- ๋ ๋ง์ ๋น๋์
์ด๋ ๊ฒ ํ๋๊น ๋ฐ๋ฐ์ด ๋๋ ์ฌ๋ก
ABC
BCA
์ํํ์ผ๋ก ์ฃผ์ด์ง ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๋ฐ๋ผ์ 10์ง๋ฒ ํํ์์ผ๋ก ๊ฐ ์ํ๋ฒณ ๊ฐ์๋ฅผ ์ธ์
ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int N;
int alpha_cnt[26];
bool cmp(int a, int b) {
return a > b;
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N;
string s;
for (int i=0; i<N; ++i) {
cin >> s;
int p = 1;
for (int j=s.length()-1; j>=0; --j) {
alpha_cnt[s[j] - 'A'] += p;
p *= 10;
}
}
sort(alpha_cnt, alpha_cnt+26, cmp);
int ans = 0;
int d = 9;
for (int i=0; i<26; ++i) {
if (alpha_cnt[i] == 0) continue;
ans += alpha_cnt[i] * d;
--d;
}
cout << ans;
return 0;
}
17472. ๋ค๋ฆฌ ๋ง๋ค๊ธฐ 2
๋ฌธ์ ์์ฝ
N X M ํฌ๊ธฐ์ ์ง๋๊ฐ ์ฃผ์ด์ง๋ค.
์ง๋์ ๊ฐ ์นธ์ ๋
๋๋ ๋ฐ๋ค์ด๋ค.
์ฌ์ด๋ ๋ ์ด ์ํ์ข์ฐ๋ก ์ธ์ ํด ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
๋ชจ๋ ์ฌ์ ์ฐ๊ฒฐํ๊ธฐ ์ํด ๋ค๋ฆฌ๋ฅผ ๊ฑด์คํ๋ ค๊ณ ํ์ ๋,
์ต์์ ๋น์ฉ์ผ๋ก ๋ชจ๋ ์ฌ์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด์.


- ๋ค๋ฆฌ์ ๊ธธ์ด๋ 2 ์ด์์ด์ด์ผ ํ๋ค.
- ๋ค๋ฆฌ์ ๋ฐฉํฅ์ด ์ค๊ฐ์ ๋ฐ๋๋ฉด ์๋๋ค.
- ๋ค๋ฆฌ๋ ๋ฐ๋ค์๋ง ๊ฑด์คํ ์ ์๋ค.
(์์ ์ ๋ ฅ)
7 8 => ์ง๋์ ํฌ๊ธฐ N, M
0 0 0 0 0 0 1 1
1 1 0 0 0 0 1 1
1 1 0 0 0 0 0 0
1 1 0 0 0 1 1 0
0 0 0 0 0 1 1 0
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
ํด์ค & ์ ์ฒด ์ฝ๋
๋ฅ๋ ฅ ๋ฐ์ ์๋ ๋ฌธ์ ์๋ค. ์ฐธ๊ณ ํ์ฌ ํด๊ฒฐํ๋ค.
์ฒซ๋ฒ์งธ ๊ณ ๋ฏผ์ด์๋ ์ง์ ์ ์ฌ์ ๋ํ ์ ๋ณด๋ฅผ ๋ชจ๋ ์๊ณ ์๋ค๊ณ ํ์ ๋,
๊ฐ ์ฌ ์ฌ์ด์ ์ต์ ๊ฑฐ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ๊ฒฐ์ ํ๋์ง์ ๋ํ ๊ฒ์ด์๋ค.
๊ฐ ์ฌ ๊ฐ์ ๊ด๊ณ์ ์ง์คํ๋ค๋ณด๋๊น ์ฒ๋ฆฌ๊ฐ ์ด๋ ค์ ๋ ๊ฒ ๊ฐ์๋ค.
๊ทธ๋ฅ ๋ชจ๋ ๋
์ขํ๋ค์ ์ํํ๋ฉฐ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํ๋ค.
(๋ฏธ๋ฆฌ ์ฌ๋ค์ id๋ค์ ๋ถ์ฌํด๋์ ์ํ์์)
์ด๋ ๊ฒ ์ง์ด์ง ์ ์๋ ๋ค๋ฆฌ๋ค์ ํ๋ณด๊ตฐ์ ๋ชจ๋ ๊ตฌํ ๋ค์
- MST (Minimum Spanning Tree)
- Kruskal (Union-Find; greedy)
์ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์ด์ฉํด์ ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ์๋ค.
๋ชจ๋ vertex (์ฌ)๋ค์ ์ฐ๊ฒฐํ๋
์ต์ ๋น์ฉ์ edge(๋ค๋ฆฌ) ์งํฉ์ ์ฐพ๋ ๋ฌธ์ ๋ก ํ์๋๊ธฐ ๋๋ฌธ์
์ ํํ๊ฒ ๋์๋๋ค๊ณ ๋ณผ ์ ์๋ค.
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define MAX 10
#define ISLAND_MAX 7
struct pos {
int y; int x;
};
struct tbridge {
int len; int start; int end;
};
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};
int N,M;
int map[MAX][MAX];
int island[MAX][MAX];
bool visited[MAX][MAX];
int island_cnt = 0;
vector<pos> land;
vector<tbridge> bridge;
int parent[ISLAND_MAX];
bool check_bound(int y, int x) {
return y>=0 && y<N && x>=0 && x<M;
}
bool check(int y, int x) {
return check_bound(y, x) && !visited[y][x] && map[y][x] == 1;
}
// NOTE : bfs๋ฅผ ํ๋ฉฐ ๊ฐ ์ฌ๋ง๋ค id (island_cnt)๋ฅผ ๋ถ์ฌํ๋ค
void numbering_island() {
for (int i=0; i<land.size(); ++i) {
int _y = land[i].y, _x = land[i].x;
if (visited[_y][_x]) continue;
queue<pos> q;
visited[_y][_x] = true;
island[_y][_x] = ++island_cnt;
q.push({_y, _x});
while (!q.empty()) {
int y = q.front().y, x = q.front().x;
q.pop();
for (int i=0; i<4; ++i) {
int ny=y+dy[i], nx=x+dx[i];
if (!check(ny, nx)) continue;
visited[ny][nx] = true;
island[ny][nx] = island_cnt;
q.push({ny, nx});
}
}
}
}
void make_bridge() {
// NOTE : ๋ชจ๋ ๋
์ขํ๋ฅผ ์ํํ๋ฉฐ ๊ฐ๋ฅํ ๋ค๋ฆฌ๋ค์ ๋ชจ๋ ๊ณ์ฐ
for (int i=0; i<land.size(); ++i) {
int y=land[i].y, x=land[i].x;
int start_island_id = island[y][x];
for (int d=0; d<4; ++d) {
int ny=y, nx=x;
int len = 0;
while (1) {
ny += dy[d]; nx += dx[d];
/**
* NOTE
* - ๊ฒฝ๊ณ, ๊ธธ์ด, ๋ฐ๋ค ์์ ์๋์ง ์ฌ๋ถ๋ฅผ ์ฒดํฌ
* - 0์ ๋ฐ๋ค, 1์ ๋
์ ์๋ฏธํ๋ค.
*/
if (check_bound(ny, nx)) {
if (map[ny][nx] == 0) ++len;
else if (
map[ny][nx] == 1 &&
len>=2 &&
start_island_id != island[ny][nx]
) {
bridge.push_back({len, start_island_id, island[ny][nx]});
break;
}
else break;
}
else break;
}
}
}
}
int find(int a) {
if (parent[a] == a) return a;
return (parent[a] = find(parent[a]));
}
// NOTE : ๋ค๋ฆฌ id ๊ฐ์ด ์์ ์ชฝ์ ๋ถ๋ชจ๋ก
void uni(int a, int b) {
int pa = find(a);
int pb = find(b);
if (pa == pb) return;
if (pa < pb) parent[pb] = pa;
else parent[pa] = pb;
}
bool has_same_parent(int a, int b) {
return find(a) == find(b);
}
bool b_cmp(tbridge& a, tbridge& b) { return a.len < b.len; }
int answer() {
// NOTE : ๋ค๋ฆฌ ๊ธธ์ด ์ต์ํฉ์ ์ป์ด์ผ ํ๋ค
sort(bridge.begin(), bridge.end(), b_cmp);
for (int i=1; i<=island_cnt; ++i) {
parent[i] = i;
}
int total_len = 0;
for (int i=0; i<bridge.size(); ++i) {
// NOTE : ์ฐ๊ฒฐ๋์ด ์์ง ์์ ์ฌ๋ค์ ๋ํด union ์ฐ์ฐ์ ์งํ
if (!has_same_parent(bridge[i].start, bridge[i].end)) {
uni(bridge[i].start, bridge[i].end);
total_len += bridge[i].len;
}
}
// NOTE : ๋ค๋ฆฌ id ๊ฐ์ด ์์ ์ชฝ์ ๋ถ๋ชจ๋ก ๋๊ธฐ ๋๋ฌธ์ 1์ด ์๋๋ฉด ์ฐ๊ฒฐ๋ ์ ์์์ ๋ปํจ
for (int i=1; i<=island_cnt; ++i) {
if (find(i) != 1) {
return -1;
}
}
return total_len;
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N >> M;
for (int i=0; i<N; ++i) {
for (int j=0; j<M; ++j) {
// NOTE : 0์ ๋ฐ๋ค, 1์ ๋
์ ์๋ฏธํ๋ค.
cin >> map[i][j];
if (map[i][j] == 1) {
// NOTE : bridge ํ๋ณด๊ตฐ๋ค์ ๋ง๋ค๊ธฐ์ํด ์ํํ๊ธฐ ๋๋ฌธ์ ๋
๋ค์ ์ขํ๋ฅผ ๋ฏธ๋ฆฌ ํ๋ณด
land.push_back({i, j});
}
}
}
numbering_island();
make_bridge();
cout << answer();
return 0;
}
Review
17836. ๊ณต์ฃผ๋์ ๊ตฌํด๋ผ!
2629. ์ํ์ ์ธ
2179. ๋น์ทํ ๋จ์ด
14890. ๊ฒฝ์ฌ๋ก
13549. ์จ๋ฐ๊ผญ์ง 3
1562. ๊ณ๋จ ์
13์ฃผ์ฐจ
๋ชฉ์ฐจ
- ME
- ํ์
14499. ์ฃผ์ฌ์ ๊ตด๋ฆฌ๊ธฐ
๋ฌธ์ ์์ฝ
N X M ํฌ๊ธฐ์ ์ง๋๊ฐ ์ฃผ์ด์ง๋ค.
์ง๋์ ์ค๋ฅธ์ชฝ์ ๋์ชฝ, ์์ชฝ์ ๋ถ์ชฝ์ด๋ค.
์ฃผ์ฌ์๋ ์ง๋ ์์ ์ ๋ฉด์ด 1์ด๊ณ ,
๋์ชฝ์ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ด 3์ธ ์ํ๋ก ๋์ฌ์ ธ ์๋ค.
๊ฐ์ฅ ์ฒ์์ ์ฃผ์ฌ์์๋ ๋ชจ๋ ๋ฉด์ 0์ด ์ ํ์ ธ ์๋ค.

์ฃผ์ฌ์๋ฅผ ๊ตด๋ฆด ๋ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ๋ฐ๋ฅธ๋ค.
- ์ด๋ํ ์นธ์ ์ฐ์ฌ ์๋ ์๊ฐ 0์ด๋ฉด, ์ฃผ์ฌ์์ ๋ฐ๋ฅ๋ฉด์ ์ฐ์ฌ ์๋ ์๊ฐ ์นธ์ ๋ณต์ฌ๋๋ค.
- 0์ด ์๋ ๊ฒฝ์ฐ์๋ ์นธ์ ์ฐ์ฌ ์๋ ์๊ฐ ์ฃผ์ฌ์์ ๋ฐ๋ฅ๋ฉด์ผ๋ก ๋ณต์ฌ๋๋ฉฐ,
์นธ์ ์ฐ์ฌ ์๋ ์๋ 0์ด ๋๋ค.
์
๋ ฅ์ผ๋ก ์ฃผ์ฌ์๋ฅผ ์ด๋์ํค๋ ๋ช
๋ น์ด ์ฃผ์ด์ง ๋,
์ด๋ํ์ ๋๋ง๋ค ์ฃผ์ฌ์์ ์ ๋ฉด์ ์ฐ์ฌ ์๋ ๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ณด์.
(์์ ์ ๋ ฅ)
4 2 0 0 8 => ์ง๋์ ํฌ๊ธฐ N,M, ์ฃผ์ฌ์๋ฅผ ๋์ ๊ณณ์ ์ขํ y,x, ๋ช ๋ น์ ๊ฐ์ K
0 2 => N๊ฐ ์ค์ ๊ฑธ์ณ์ ์ง๋์ ์ ๋ณด
3 4
5 6
7 8
4 4 4 1 3 3 3 2 => ๋ช ๋ น์ ์ ๋ณด
๋์ชฝ์ 1, ์์ชฝ์ 2, ๋ถ์ชฝ์ 3, ๋จ์ชฝ์ 4๋ก ์ฃผ์ด์ง๋ค.
ํด์ค & ์ ์ฒด ์ฝ๋
์ฃผ์ฌ์๋ฅผ ๊ตด๋ฆด ๋๋ง๋ค top (์๋ฉด) ์์ฒด๊ฐ ๋๊ตฌ์ธ์ง
์์๋ด๋ ค๊ณ ํค๋ฉจ๋ ๊ฒ ๊ฐ๋ค.
๋์๋จ๋ถ ์ด๋๋ฐฉํฅ์ ๋ฐ๋ผ์ ๊ตฌ๋ฅธ ๋ค์ ๋ฌด์์ด ์๋ฉด์ธ์ง ํ์ ํ์ง ๋ง์.
์ฃผ์ด์ง ์ ๊ฐ๋์ ์ธํ
(1์ด ์๋ฉด, 3์ด ๋์ชฝ ๋ฐฉํฅ) ์์
๊ฐ ์์ฒด๋ฅผ ์ง์ ๋ณํ์์ผ์ฃผ์.
#include <iostream>
#include <string>
using namespace std;
#define MAX 20
int N,M,sy,sx,K;
int map[MAX][MAX];
// NOTE : ๋์ชฝ์ 1, ์์ชฝ์ 2, ๋ถ์ชฝ์ 3, ๋จ์ชฝ์ 4๋ก ์ฃผ์ด์ง๋ค.
int dy[] = {0, 0, 0, -1, 1};
int dx[] = {0, 1, -1, 0, 0};
int dice[7];
bool check(int y, int x) {
return y>=0 && y<N && x>=0 && x<M;
}
void move(int dir) {
int d1=dice[1], d2=dice[2], d3=dice[3], d4=dice[4], d5=dice[5], d6=dice[6];
// ๋
if (dir == 1) {
dice[1] = d4; dice[3] = d1; dice[6] = d3; dice[4] = d6;
return;
}
// ์
if (dir == 2) {
dice[1] = d3; dice[3] = d6; dice[6] = d4; dice[4] = d1;
return;
}
// ๋ถ
if (dir == 3) {
dice[1] = d5; dice[2] = d1; dice[6] = d2; dice[5] = d6;
return;
}
// ๋จ (dir == 4)
dice[1] = d2; dice[2] = d6; dice[6] = d5; dice[5] = d1;
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N >> M >> sy >> sx >> K;
for (int i=0; i<N; ++i) {
for (int j=0; j<M; ++j) {
cin >> map[i][j];
}
}
int dir;
int y=sy, x=sx;
// NOTE : K๋ฒ์ ๊ฑธ์ณ์ ์ฃผ์ฌ์๋ฅผ ๊ตด๋ฆฐ๋ค
while (K--) {
cin >> dir;
int ny=y+dy[dir], nx=x+dx[dir];
// NOTE : ๋ง์ฝ ๋ฐ๊นฅ์ผ๋ก ์ด๋์ํค๋ ค๊ณ ํ๋ ๊ฒฝ์ฐ์๋ ํด๋น ๋ช
๋ น์ ๋ฌด์ํด์ผ ํ๋ค
if (!check(ny, nx)) continue;
move(dir);
// NOTE : ์ด๋ํ ์นธ์ ์ฐ์ฌ ์๋ ์๊ฐ 0์ด๋ฉด, ์ฃผ์ฌ์์ ๋ฐ๋ฅ๋ฉด์ ์ฐ์ฌ ์๋ ์๊ฐ ์นธ์ ๋ณต์ฌ๋๋ค.
if (map[ny][nx] == 0) map[ny][nx] = dice[6];
// NOTE : 0์ด ์๋ ๊ฒฝ์ฐ์๋ ์นธ์ ์ฐ์ฌ ์๋ ์๊ฐ ์ฃผ์ฌ์์ ๋ฐ๋ฅ๋ฉด์ผ๋ก ๋ณต์ฌ๋๋ฉฐ, ์นธ์ ์ฐ์ฌ ์๋ ์๋ 0์ด ๋๋ค.
else {
dice[6] = map[ny][nx];
map[ny][nx] = 0;
}
// NOTE : ์ฃผ์ฌ์๋ฅผ ๊ตด๋ฆฌ๊ณ ์๋ฉด์ ์ถ๋ ฅ
cout << dice[1] << '\n';
y = ny; x = nx;
}
return 0;
}
17142. ์ฐ๊ตฌ์ 3
๋ฌธ์ ์์ฝ
N X N ํฌ๊ธฐ์ ์ฐ๊ตฌ์๊ฐ ์๋ค.
๊ฐ ์ฐ๊ตฌ์์ ์นธ์ 3์ข ๋ฅ ์ค ํ๋๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
- 0 : ๋น ์นธ
- 1 : ๋ฒฝ
- 2 : ๋ฐ์ด๋ฌ์ค
๋ฐ์ด๋ฌ์ค๋ ํ์ฑ ์ํ์ ๋นํ์ฑ ์ํ๊ฐ ์๋ค.
๊ฐ์ฅ ์ฒ์์ ๋ชจ๋ ๋ฐ์ด๋ฌ์ค๋ ๋นํ์ฑ ์ํ์ด๋ค.
์ด ๋ฌธ์ ๊ฐ ๋ฌป๋ ๊ฒ์ ์ฃผ์ด์ง ๋นํ์ฑ ๋ฐ์ด๋ฌ์ค ์ค์์
M ๊ฐ๋ฅผ ํ์ฑ ์ํ๋ก ๋ฐ๊พผ๋ค๊ณ ํ์ ๋,
์ฐ๊ตฌ์์ ๋ชจ๋ ๋น ์นธ์ ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง๋ ์ต์ ์๊ฐ์ ๊ตฌํ๋ ๊ฒ์ด๋ค.
์ค์ํ ๊ฒ์ ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง๋ / ๋ณต์ ๋๋ ์๋ฆฌ๋ค.
- ๋ฐ์ด๋ฌ์ค๋ ์ํ์ข์ฐ๋ก ์ธ์ ํ ๋น ์นธ์ผ๋ก ํผ์ง๋ค.
- ๋ชจ๋ ๋น ์นธ์ผ๋ก ๋์์ ๋ณต์ ๋๋ค. (1์ด ์์)
- ๋ง์ฝ ์ด๋ฏธ ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง ์นธ์ด๋ผ๋ฉด, ์๊ฐ์ด ์์๋์ง ์๋๋ค.
(์์ ์ ๋ ฅ)
7 3 => ์ฐ๊ตฌ์์ ํฌ๊ธฐ N, ํ์ฑ ๋ฐ์ด๋ฌ์ค์ ๊ฐ์ M
2 0 0 0 1 1 0 => N๊ฐ ์ค์ ๊ฑธ์ณ์ ์ฐ๊ตฌ์์ ์ ๋ณด
0 0 1 0 1 2 0
0 1 1 0 1 0 0
0 1 0 0 0 0 0
0 0 0 2 0 1 1
0 1 0 0 0 0 0
2 1 0 0 0 0 2
ํด์ค & ์ ์ฒด ์ฝ๋
DFS์ BFS๋ฅผ ์ด์ฉํด์ ๊ตฌํํ๋ ๋ฌธ์ ์๋ค.
#include <iostream>
#include <vector>
#include <climits>
#include <queue>
#include <cstring>
using namespace std;
#define MAX 50
#define MAX_VIRUS 2500
struct pos {
int y; int x;
};
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};
vector<pos> virus;
vector<pos> activated;
bool visited[MAX_VIRUS];
int N,M;
int lab[MAX][MAX];
int time_map[MAX][MAX];
int ans = INT_MAX;
int empty_cnt = 0;
int infect_cnt = 0;
bool check(int y, int x) {
return y>=0 && y<N && x>=0 && x<N &&
(lab[y][x] != 1) && (time_map[y][x] == -1);
}
int bfs() {
infect_cnt = 0;
/**
* NOTE
* -1๋ก ์ฒ์์ ๊ฐฑ์ ํ์ฌ ๋ฐ์ด๋ฌ์ค๊ฐ ํ์ฐ๋์ง ์์์์ ํ๊ธฐ
*/
memset(time_map, -1, sizeof(time_map));
queue<pos> q;
for (const auto& p : activated) {
q.push(p);
time_map[p.y][p.x] = 0;
}
int time = 0;
while (!q.empty()) {
auto p = q.front(); q.pop();
int y = p.y, x = p.x;
for (int i=0; i<4; ++i) {
int ny=y+dy[i], nx=x+dx[i];
if (!check(ny, nx)) continue;
time_map[ny][nx] = time_map[y][x] + 1;
/**
* NOTE
* - ๋น๋
์ด์์ ๋์๋ง bfs๊ฐ ๋ฆฌํดํ๋ time์ ๊ฐฑ์ ํ๋ค
* - ์ด๋ฏธ ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ์นธ (2) ์ผ ๊ฒฝ์ฐ์๋ ์๊ฐ์ด ์์๋์ง ์๋๋ค
*/
if (lab[ny][nx] == 0) {
++infect_cnt;
time = time_map[ny][nx];
}
q.push({ny, nx});
}
}
return time;
}
void dfs(int x, int cnt) {
if (cnt == M) {
int t = bfs();
// NOTE : ๋ชจ๋ ๋น ์นธ์ ํ์ฐ๋์ง ์์๋ค๋ฉด ์ต์ ์๊ฐ ๊ฐฑ์ x
if (empty_cnt == infect_cnt) ans = min(t, ans);
return;
}
for (int i=x; i<virus.size(); ++i) {
if (visited[i]) continue;
visited[i] = true; activated.push_back(virus[i]);
dfs(i, cnt+1);
visited[i] = false; activated.pop_back();
}
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N >> M;
for (int i=0; i<N; ++i) {
for (int j=0; j<N; ++j) {
cin >> lab[i][j];
// NOTE : virus ์์น๋ฅผ ๋ฏธ๋ฆฌ ์ ์ฅํด ๋๋๋ค
if (lab[i][j] == 2) virus.push_back({i, j});
// NOTE : ๋ชจ๋ ๋น์นธ์ ํ์ฐ๋์๋์ง ํ์ธํ๊ธฐ ์ํด ๋น์นธ์ ๊ฐ์๋ฅผ ์ธ๋๋๋ค
else if (lab[i][j] == 0) ++empty_cnt;
}
}
dfs(0, 0);
if (ans == INT_MAX) ans = -1;
cout << ans;
return 0;
}
Review
19637. IF๋ฌธ ์ข ๋์ ์จ์ค
17822. ์ํ ๋๋ฆฌ๊ธฐ
9017. ํฌ๋ก์ค ์ปจํธ๋ฆฌ
22866. ํ ๋ณด๊ธฐ
2531. ํ์ ์ด๋ฐฅ
2493. ํ
12์ฃผ์ฐจ
๋ชฉ์ฐจ
- ME
- ํ์
3190. ๋ฑ
๋ฌธ์ ์์ฝ
N X N ๋ณด๋ ์์ ๊ฒ์์ ์งํํ๋ค.
๋ฑ์ ์ด ๋ณด๋ ์์์ ๊ธฐ์ด๋ค๋๋๋ฐ ์ฌ๊ณผ๋ฅผ ๋จน์ผ๋ฉด ๋ฑ์ ๊ธธ์ด๊ฐ ๋์ด๋๋ค.
๋ฒฝ or ์๊ธฐ์์ ๊ณผ ๋ถ๋ชํ๋ฉด ๊ฒ์์ด ๋๋๋ค.
๋ฑ์ ์์ ๋น์ ๋งจ์ ๋งจ์ข์ธก์ ์์นํ๊ณ , ์ค๋ฅธ์ชฝ์ ํฅํ๋ค.
์ฒ์ ๋ฑ์ ๊ธธ์ด๋ 1์ด๋ค.
๋ฑ์ ๋งค์ด๋ง๋ค ์ด๋์ ํ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ๋ฐ๋ฅธ๋ค.
- ๋จผ์ ๋ฑ์ ๋ชธ๊ธธ์ด๋ฅผ ๋๋ ค ๋จธ๋ฆฌ๋ฅผ ๋ค์์นธ์ ์์น
- ๋ง์ฝ ๋ฒฝ์ด๋ ์๊ธฐ์์ ์ ๋ชธ๊ณผ ๋ถ๋ชํ๋ฉด ๊ฒ์์ ๋
- ์ด๋ํ ์นธ์ ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด, ๊ทธ ์นธ์ ์๋ ์ฌ๊ณผ๋ ์์ด์ง๊ณ ๊ผฌ๋ฆฌ๋ ์ ์๋ฆฌ
- ์ฆ, ๋ชธ๊ธธ์ด๊ฐ ๋์ด๋จ
- ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด, ๋ชธ๊ธธ์ด๋ฅผ ์ค์ฌ ๊ผฌ๋ฆฌ๊ฐ ์์นํ ์นธ์ ๋น์์ค๋ค
- ์ฆ, ๋ชธ๊ธธ์ด๊ฐ ๊ทธ๋๋ก
๊ฒ์์ด ๋ช ์ด์ ๋๋๋์ง ์ถ๋ ฅํด๋ณด์.
(์์ ์ ๋ ฅ) 6 => ๋ณด๋ ํฌ๊ธฐ N
3 => ์ฌ๊ณผ์ ๊ฐ์ K
3 4 => K๊ฐ ์ค์ ๊ฑธ์ณ์ ์ฌ๊ณผ์ ์์น
2 5
5 3
3 => ๋ฑ์ ๋ฐฉํฅ ๋ณํ ํ์ L
3 D => L๊ฐ ์ค์ ๊ฑธ์ณ์ ๋ฐฉํฅ ๋ณํ ์ ๋ณด
15 L
17 D
- 3 D := 3์ด ๋ค์ ์ค๋ฅธ์ชฝ์ผ๋ก 90๋ ํ์
- 15 L := 15์ด ๋ค์ ์ผ์ชฝ์ผ๋ก 90๋ ํ์
ํด์ค & ์ ์ฒด ์ฝ๋
๋ฑ์ ์ด์ฉํด์ ๊ตฌํํ ์ ์๋ค.
๋ฌธ์ ์์ ์ฃผ์ด์ง ๋ฑ์ ์ด๋ํ๋ ๊ท์น์ ๋ฐ๋ผ์ ๊ทธ๋๋ก ๊ตฌํํ๋ฉด ๋๋ ๋ฌธ์ ์๋ค.
#include <iostream>
#include <unordered_map>
#include <deque>
using namespace std;
#define BOARD_MAX 101
struct snake {
int y; int x;
};
// NOTE : Up, Down, Left, Right ์์
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};
int N,K,L;
unordered_map<int, char> time_to_dir;
bool apple[BOARD_MAX][BOARD_MAX];
// NOTE : front: ๊ผฌ๋ฆฌ, back: ๋จธ๋ฆฌ
deque<snake> dq;
// NOTE : ๋ฑ์ ์ฒ์์ ์ค๋ฅธ์ชฝ์ ํฅํ๋ค.
int dir=3;
bool game_over;
int dir_converter(char c) {
if (c == 'L') {
if (dir == 0) return 2;
if (dir == 1) return 3;
if (dir == 2) return 1;
if (dir == 3) return 0;
}
if (c == 'D') {
if (dir == 0) return 3;
if (dir == 1) return 2;
if (dir == 2) return 0;
if (dir == 3) return 1;
}
return -1;
}
bool check_bound(int y, int x) {
return y>=1 && y<=N && x>=1 && x<=N;
}
bool check_itself(int y, int x) {
for (const auto& p : dq) {
if (p.y == y && p.x == x) return false;
}
return true;
}
void rotate(int time) {
char l_or_d = time_to_dir[time];
dir = dir_converter(l_or_d);
}
void move() {
// NOTE : dq.back == ๋จธ๋ฆฌ, dq.front == ๊ผฌ๋ฆฌ
int ny = dq.back().y+dy[dir], nx = dq.back().x+dx[dir];
// NOTE : ๋ง์ฝ ๋ฒฝ์ด๋ ์๊ธฐ์์ ์ ๋ชธ๊ณผ ๋ถ๋ชํ๋ฉด ๊ฒ์์ด ๋๋๋ค
if (!check_bound(ny, nx) || !check_itself(ny, nx)) {
game_over = true;
return;
}
dq.push_back({ny, nx});
// NOTE : ๋ง์ฝ ์ด๋ํ ์นธ์ ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด, ๊ทธ ์นธ์ ์๋ ์ฌ๊ณผ๊ฐ ์์ด์ง๊ณ ๊ผฌ๋ฆฌ๋ ์์ง์ด์ง ์๋๋ค
if (apple[ny][nx]) {
apple[ny][nx] = false;
}
// NOTE : ๋ง์ฝ ์ด๋ํ ์นธ์ ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด, ๋ชธ๊ธธ์ด๋ฅผ ์ค์ฌ์ ๊ผฌ๋ฆฌ๊ฐ ์์นํ ์นธ์ ๋น์์ค๋ค. ์ฆ, ๋ชธ๊ธธ์ด๋ ๋ณํ์ง ์๋๋ค.
else {
for (int i=0; i<dq.size()-1; ++i) {
dq[i].y = dq[i+1].y;
dq[i].x = dq[i+1].x;
}
dq.pop_back();
}
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N >> K;
int r,c;
for (int i=0; i<K; ++i) {
cin >> r >> c;
apple[r][c] = true;
}
cin >> L;
int t; char d;
for (int i=0; i<L; ++i) {
cin >> t >> d;
time_to_dir.insert({t, d});
}
int time = 0;
dq.push_back({1, 1});
while (1) {
game_over = false;
// NOTE : ๋จผ์ ๋ฑ์ ๋ชธ๊ธธ์ด๋ฅผ ๋๋ ค ๋จธ๋ฆฌ๋ฅผ ๋ค์์นธ์ ์์น์ํจ๋ค
move();
++time;
if (game_over) break;
// NOTE : ๋ฐฉํฅ์ ์ ํํด์ผ ํ๋ ์๊ฐ์ด๋ฉด ์ ํํ๋ค
if (time_to_dir.find(time) != time_to_dir.end()) rotate(time);
}
cout << time;
return 0;
}
16235. ๋๋ฌด ์ฌํ ํฌ
๋ฌธ์ ์์ฝ
N X N ํฌ๊ธฐ์ ๋ ์ด ์๋ค. ๊ฐ ์นธ์ ์ฒ์์ ์๋ถ์ 5๋งํผ ๊ฐ์ง๊ณ ์๋ค.
์ด ๋
์ ๋ํด์ ๋๋ฌด ์ ํ
ํฌ ๋ผ๋ ๊ฒ์ ์งํํ ๊ฒ์ด๋ค.
์ด๋ฅผ ์ํด M ๊ฐ์ ๋๋ฌด๋ฅผ ์ฌ์ ๊ฒ์ด๋ค.
- 1 x 1 ํฌ๊ธฐ์ ์นธ์ ์ฌ๋ฌ ๊ฐ์ ๋๋ฌด๊ฐ ์ฌ์ด์ ธ ์์ ์๋ ์๋ค.
์ฌ์ด์ง ๋๋ฌด๋ค์ ์ฌ๊ณ์ ์ ๋ณด๋ด๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
๋ด
- ๋๋ฌด๊ฐ ์์ ์ ๋์ด๋งํผ ์๋ถ์ ๋จน๊ณ , ๋์ด๊ฐ 1 ์ฆ๊ฐํ๋ค.
- ๋๋ฌด๊ฐ ์๋ ์นธ์ ์๋ ์๋ถ๋ง ๋จน์ ์ ์๋ค.
- ๋ง์ฝ ์ฌ๋ฌ ๋๋ฌด๊ฐ ์๋ค๋ฉด, ๋์ด๊ฐ ์ด๋ฆฐ ๋๋ฌด๋ถํฐ ์๋ถ์ ๋จน๋๋ค.
- ๊ฐ๊ฐ์ ๋๋ฌด๋ ์์ ์ ๋์ด๋งํผ ์๋ถ์ ๋จน์ ์ ์์ผ๋ฉด ์ฃฝ๋๋ค.
์ฌ๋ฆ
- ๋ด์ ์ฃฝ์ ๋๋ฌด๊ฐ ์๋ถ์ผ๋ก ๋ณํ๋ค.
- ์ฃฝ์ ๋๋ฌด์ ๋์ด๋ฅผ 2๋ก ๋๋ ๊ฐ์ด ๋๋ฌด๊ฐ ์๋ ์นธ์ ์๋ถ์ผ๋ก ์ถ๊ฐ๋๋ค.
๊ฐ์
- ๋๋ฌด๊ฐ ๋ฒ์ํ๋ฉฐ, ๋ฒ์ํ๋ ๋๋ฌด๋ ๋์ด๊ฐ 5์ ๋ฐฐ์์ฌ์ผ ํ๋ค.
- ์ธ์ ํ 8๊ฐ์ ์นธ์ ๋์ด๊ฐ 1์ธ ๋๋ฌด๊ฐ ์๊ธด๋ค.
๊ฒจ์ธ
- ๋ ์ ์๋ถ์ด ์ฃผ์ด์ง๋ค.
- ๊ฐ ์นธ์ ์ฃผ์ด์ง๋ ์๋ถ์ A[r][c]๋ก ์ ๋ ฅ ์์ ์ ์ฃผ์ด์ง๋ค.
์ด๋ฐ ๊ณผ์ ์ K๋
๋์ ์งํํ ๋,
K๋
์ด ์ง๋ ํ ์ด์์๋ ๋๋ฌด์ ๊ฐ์๋ฅผ ์ถ๋ ฅํด๋ณด์.
(์์ ์ ๋ ฅ)
5 2 1 => ๋ ์ ํฌ๊ธฐ N, ๋๋ฌด์ ๊ฐ์ M, ์ ํ ํฌ K๋
2 3 2 3 2 => N๊ฐ ์ค์ ๊ฑธ์ณ์ ๋งค ๊ฒจ์ธ ๊ฐ ์นธ์ ์ฃผ์ด์ง๋ ์๋ถ์ ์
2 3 2 3 2
2 3 2 3 2
2 3 2 3 2
2 3 2 3 2
2 1 3 => M๊ฐ ์ค์ ๊ฑธ์ณ์ ๋๋ฌด์ ์ ๋ณด : ๋๋ฌด ์์น x, y, ๋์ด z
3 2 3
ํด์ค & ์ ์ฒด ์ฝ๋
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#define PLANE_MAX 11
using namespace std;
int dy[] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dx[] = {-1, 0, 1, -1, 1, -1, 0, 1};
int N,M,K;
// NOTE : ๋งค ๊ฒจ์ธ ์ฑ์์ง๋ ์๋ถ์ ์
int plane[PLANE_MAX][PLANE_MAX];
// NOTE : ๊ฐ ์นธ์ ์๋ถ ์ํ
int nutrient[PLANE_MAX][PLANE_MAX];
/**
* NOTE
* - ๊ฐ ์นธ์๋ ์ฌ๋ฌ ๊ฐ์ ๋๋ฌด๊ฐ ๋ด๊ธธ ์ ์๋ค
* - ๋๋ฌด์ ๋์ด๊ฐ ๋ด๊ธฐ๊ฒ ๋๋ค
*/
vector<int> tree[PLANE_MAX][PLANE_MAX];
bool age_cmp(int a1, int a2) {
return a1 < a2;
}
bool check_bound(int y, int x) {
return y>=1 && y<=N && x>=1 && x<=N;
}
void spring_and_summer() {
// spring
for (int y=1; y<=N; ++y) {
for (int x=1; x<=N; ++x) {
if (tree[y][x].empty()) continue;
// NOTE : ๊ฐ์ฅ ์ด๋ฆฐ ๋๋ฌด๊ฐ ๋จผ์ ์๋ถ์ ๋จน๋๋ค
sort(tree[y][x].begin(), tree[y][x].end(), age_cmp);
// NOTE : ์๋ถ์ ์ญ์ทจํ๊ณ ๋์ด๊ฐ ๋จน์ ๋๋ฌด๋ค์ ๋์ด๊ฐ ๋ด๊ธด๋ค
vector<int> tmp;
int die = 0;
for (int i=0; i<tree[y][x].size(); ++i) {
int age = tree[y][x][i];
if (nutrient[y][x] < age) {
die += age/2;
}
else {
nutrient[y][x] -= age;
tmp.push_back(age+1);
}
}
tree[y][x].clear();
for (const auto& n : tmp) {
tree[y][x].push_back(n);
}
// summer
nutrient[y][x] += die;
}
}
}
void fall() {
for (int y=1; y<=N; ++y) {
for (int x=1; x<=N; ++x) {
if (tree[y][x].empty()) continue;
for (int t=0; t<tree[y][x].size(); ++t) {
// NOTE : ๋์ด๊ฐ 5์ ๋ฐฐ์์ฌ์ผ ๋ฒ์ ๊ฐ๋ฅํ๋ค
if (tree[y][x][t]%5 != 0) continue;
for (int i=0; i<8; ++i) {
int ny=y+dy[i], nx=x+dx[i];
if (!check_bound(ny, nx)) continue;
tree[ny][nx].push_back(1);
}
}
}
}
}
void winter() {
for (int i=1; i<=N; ++i) {
for (int j=1; j<=N; ++j) {
nutrient[i][j] += plane[i][j];
}
}
}
int answer() {
int cnt = 0;
for (int i=1; i<=N; ++i) {
for (int j=1; j<=N; ++j) {
if (tree[i][j].empty()) continue;
cnt += tree[i][j].size();
}
}
return cnt;
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N >> M >> K;
for (int i=1; i<=N; ++i) {
for (int j=1; j<=N; ++j) {
cin >> plane[i][j];
nutrient[i][j] = 5;
}
}
int y,x,age;
for (int i=0; i<M; ++i) {
cin >> y >> x >> age;
tree[y][x].push_back(age);
}
while (K--) {
spring_and_summer();
fall();
winter();
}
cout << answer();
return 0;
}
Review
20922. ๊ฒน์น๋ ๊ฑด ์ซ์ด
1005. ACM Craft
1027. ๊ณ ์ธต ๊ฑด๋ฌผ
1406. ์๋ํฐ
1459. ๊ฑท๊ธฐ
1759. ์ํธ ๋ง๋ค๊ธฐ
11์ฃผ์ฐจ
๋ชฉ์ฐจ
- ME
- ํ์
15686. ์นํจ ๋ฐฐ๋ฌ
๋ฌธ์ ์์ฝ
ํฌ๊ธฐ๊ฐ NXN ์ธ ๋์๊ฐ ์ฃผ์ด์ง๋ค.
๋์์ ๊ฐ ์นธ์ ๋น ์นธ, ์นํจ์ง, ์ง ์ค ํ๋์ด๋ค.
์นํจ ๊ฑฐ๋ฆฌ ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ๋ค.
์ง๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ
๋์์ ์นํจ ๊ฑฐ๋ฆฌ ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ๋ค.
๋ชจ๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ ํฉ
0์ ๋น ์นธ, 1์ ์ง, 2๋ ์นํจ์ง์ด๋ค.
์
๋ ฅ์ผ๋ก๋ M์ด ์ฃผ์ด์ง๊ณ ,
๋์์ ์๋ ์นํจ์ง ์ค์์ M๊ฐ๋ฅผ ๊ณ ๋ฅธ๋ค ๋๋จธ์ง๋ ๋ชจ๋ ํ์
์ํจ๋ค.
์ด๋, ์ด๋ป๊ฒ ๊ณจ๋ผ์ผ ๋์์ ์นํจ๊ฑฐ๋ฆฌ ๊ฐ ๊ฐ์ฅ ์๊ฒ ๋ ์ง
๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ณด์.
(์์ ์ ๋ ฅ)
5 3 => N M
0 0 1 0 0 => ๋์
0 0 2 0 1
0 1 2 0 0
0 0 1 0 0
0 0 0 0 2
ํด์ค
1. ์ ๋ ฅ
์ง๊ณผ ์นํจ์ง์ ์์น๋ฅผ ๋ฏธ๋ฆฌ ์ ๋ ฅ๋ฐ์ ๋ ๊ด๋ฆฌํด์ค๋ค.
int N,M;
struct pos {
int y; int x;
};
vector<pos> home, chicken;
...
cin >> N >> M;
for (int i=0; i<N; ++i) {
for (int j=0; j<N; ++j) {
int t; cin >> t;
if (t == 1) home.push_back({i, j});
else if (t == 2) chicken.push_back({i, j});
}
}
2. DFS
์ผ๋ฐ์ ์ผ๋ก ๋ฐฑํธ๋ํนํ๋ dfs ๋ชจ์ต์ด๋ค.
dfs ์คํ๋ง๋ค ์ ํํ chicken ์ choose ์ ๋ฃ์ด์ค๋ค.
M์ผ๋ก ๊น์ด๊ฐ ๋๋ฌํ๋ฉด cal ์ด๋ผ๋ ํจ์๋ฅผ ํตํด์
๋์์ ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ค.
์ฌ๊ธฐ์ ์ ์ํด์ผํ ๊ฒ์, check ์ธ๋ฐ
์ด๊ฒ ์์ผ๋ฉด ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
๊ฒฐ๊ตญ ์ฐ๋ฆฌ๊ฐ ๊ด์ฌ ์๋ ๊ฒ์ ๊ฑฐ๋ฆฌ์ด๋ฉฐ ์กฐํฉ์ ๋ฌธ์ ์ด์ง
์นํจ์ง์ด ์ด๋ ์์๋ก ์ ํ๋๋์ง๋ ๊ด์ฌ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ check๋ฅผ ํตํด ๊ด๋ฆฌํ๋ฉฐ ํจ์ค์์ผ์ค์ผํ๋ค.
// main
dfs(0, 0);
...
int ans = INT_MAX;
vector<pos> choose;
bool check[MAX];
int dist(const pos& p1, const pos& p2) {
return abs(p1.y - p2.y) + abs(p1.x - p2.x);
}
int cal() {
int sum = 0;
for (int i=0; i<home.size(); ++i) {
int tmp = INT_MAX;
for (int j=0; j<choose.size(); ++j) {
tmp = min(tmp, dist(home[i], choose[j]));
}
sum += tmp;
}
return sum;
}
void dfs(int cur, int cnt) {
if (cnt == M) {
ans = min(ans, cal());
return;
}
for (int i=cur; i<chicken.size(); ++i) {
if (check[i]) continue;
choose.push_back(chicken[i]); check[i] = true;
dfs(i, cnt+1);
choose.pop_back(); check[i] = false;
}
}
์ ์ฒด ์ฝ๋
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
#define MAX 13
using pii = pair<int, int>;
struct pos {
int y; int x;
};
vector<pos> home, chicken;
vector<pos> choose;
bool check[MAX];
int N,M;
int ans = INT_MAX;
int dist(const pos& p1, const pos& p2) {
return abs(p1.y - p2.y) + abs(p1.x - p2.x);
}
int cal() {
int sum = 0;
for (int i=0; i<home.size(); ++i) {
int tmp = INT_MAX;
for (int j=0; j<choose.size(); ++j) {
tmp = min(tmp, dist(home[i], choose[j]));
}
sum += tmp;
}
return sum;
}
void dfs(int cur, int cnt) {
if (cnt == M) {
ans = min(ans, cal());
return;
}
for (int i=cur; i<chicken.size(); ++i) {
if (check[i]) continue;
choose.push_back(chicken[i]); check[i] = true;
dfs(i, cnt+1);
choose.pop_back(); check[i] = false;
}
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N >> M;
for (int i=0; i<N; ++i) {
for (int j=0; j<N; ++j) {
int t; cin >> t;
if (t == 1) home.push_back({i, j});
else if (t == 2) chicken.push_back({i, j});
}
}
dfs(0, 0);
cout << ans;
return 0;
}
11000. ๊ฐ์์ค ๋ฐฐ์
๋ฌธ์ ์์ฝ
Si ์ ์์ํด์ Ti ์ ๋๋๋ N ๊ฐ์ ์์
์ด ์ฃผ์ด์ง๋ค.
์ต์์ ๊ฐ์์ค์ ์ฌ์ฉํด์ ๋ชจ๋ ์์
์ด ๊ฐ๋ฅํ๊ฒ ํด์ผํ๋ค๊ณ ํ์ ๋,
๋ช ๊ฐ์ ๊ฐ์์ค์ด ํ์ํ ์ง ์ถ๋ ฅํด๋ณด์.
(์์ ์ด ๋๋ ์งํ์ ๋ค์ ์์ ์ ๋ฐ๋ก ์์๊ฐ๋ฅํ๋ค.)
(์์ ์ ๋ ฅ)
3 => N
1 3 => S1, T1
2 4
3 5
ํด์ค & ์ ์ฒด ์ฝ๋
- ๊ทธ๋ฆฌ๋
- ์ ๋ ฌ
- ์ฐ์ ์์ ํ
์ 3๊ฐ์ง๋ก ํด๊ฒฐํ๋ ๋ฌธ์ ์๋ค.
์์
[์์, ๋] ์๋ค์ ๋ํ์ฌ ๋ชจ๋ ์ปจํ
์ด๋์ ๋ฃ์ด๋๊ณ
์์์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
๊ฐ์ฅ ๋จผ์ ์์ํ๋ ์์ ์ ๊ฐ์์ค์ ๋ฃ์ด๋๊ณ ๋ณด๋ ๊ฒ.
pq๋ intํ์
์ min heap์ผ๋ก ๊ด๋ฆฌํ ๊ฒ์ด๊ณ , (์ต๋ํ ๋ถ์ฌ ๋ฃ์ด์ผ ํ๋๊น)
๋๋๋ ์๊ฐ ์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
์ ๋ ฌ ๋ ์์
์๋ค์ ์ํํ๋ฉด์
ํ์ฌ ์์
์์ ์์ ์๊ฐ๊ณผ pq์ top์ ์๋ ๊ฐ์ ๋น๊ต.
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
using pii = pair<int, int>;
int N;
vector<pii> v;
priority_queue<int, vector<int>, greater<int>> pq;
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N;
int s,t;
for (int i=0; i<N; ++i) {
cin >> s >> t;
v.push_back({s, t});
}
// NOTE : ์์
์ ์์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค
sort(v.begin(), v.end());
// NOTE : ์ฒซ๋ฒ์งธ ์์
์ ๊ฐ์์ค์ ๋ฃ๊ณ ์์
pq.push(v[0].second);
for (int i=1; i<N; ++i) {
int t = pq.top();
// NOTE : ๋๊ฐ์ ๊ฐ์์ค์ ๋ฃ์ ์ ์๋ค (๋ค์ ์์
์์ ์๊ฐ >= ํ์ฌ ์์
๋๋๋ ์๊ฐ)
if (v[i].first >= t) pq.pop();
pq.push(v[i].second);
}
// NOTE : ํ์์ pop๋์ง ๋ชปํ๊ณ ๋จ์์๋ ๋๋๋ ์๊ฐ ๊ฐ์๋งํผ ๋ต์ด๋ค
cout << pq.size();
return 0;
}
Review
2304. ์ฐฝ๊ณ ๋ค๊ฐํ
17837. ์๋ก์ด ๊ฒ์ 2
2156. ํฌ๋์ฃผ ์์
1019. ์ฑ ํ์ด์ง
12100. 2048 (Easy)
1244. ์ค์์น ์ผ๊ณ ๋๊ธฐ
10์ฃผ์ฐจ
๋ชฉ์ฐจ
- ME
- ํ์
1890. ์ ํ
๋ฌธ์ ์์ฝ
N X N ํฌ๊ธฐ์ ๊ฒ์ํ์ด ์ฃผ์ด์ง๋ค.
๊ฒ์์ ์งํํ ๊ฑด๋ฐ,
๋ชฉํ๋ ๊ฐ์ฅ ์ผ์ชฝ ์ ์นธ์์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ ์นธ์ผ๋ก
๊ท์น์ ๋ง๊ฒ ์ ํ๋ฅผ ํด์ ๊ฐ๋ ๊ฒ์ด๋ค.
๊ฐ ์นธ์๋ ํ์ฌ ์นธ์์ ๊ฐ ์ ์๋ ๊ฑฐ๋ฆฌ๊ฐ ์ ํ์๋ค.
์ด๋์ ์ค๋ฅธ์ชฝ์ด๋ ์๋์ชฝ์ผ๋ก๋ง ๊ฐ๋ฅํ๋ค.
ํ ๋ฒ ์ ํ๋ฅผ ํ ๋, ๋ฐฉํฅ์ ๋ฐ๊พธ๋ฉด ์ ๋๋ค.
0์ ๋ ์ด์ ์งํ์ ๋ง๋ ์ข ์ฐฉ์ ์ด๋ค.
๊ท์น์ ๋ง๊ฒ ์ด๋ํ์ ๋, ์ด๋ํ ์ ์๋ ๊ฒฝ๋ก์ ๊ฐ์๋ฅผ ๊ตฌํด๋ณด์.
(์์ ์ ๋ ฅ)
4 => N
2 3 3 1
1 2 1 3
1 2 3 1
3 1 1 0
ํด์ค & ์ ์ฒด ์ฝ๋
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ํด๊ฒฐํ๋ฉด ๋๋ ๋ฌธ์ ์๋ค.
0,0์์ ์์ํ๋ dp๊ฐ์ 1๋ก ์ค์ .
2์ฐจ์ ๋ฃจํ๋ฅผ ๋๋ฉด์
ํ์ฌ ์์น์์ ์ค๋ฅธ์ชฝ์ด๋ ์๋์ชฝ์ผ๋ก ์ด๋๊ฐ๋ฅํ๋ค๋ฉด
๋ฏธ๋์ dp๊ฐ์ ๋์ ๊ฐฑ์ ํด์ฃผ๋ฉด ๋๋ ๋ฌธ์ ์๋ค.
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
#define MAX 100
using ll = long long;
int map[MAX][MAX];
ll dp[MAX][MAX];
int N;
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N;
for (int i=0; i<N; ++i) {
for (int j=0; j<N; ++j) {
cin >> map[i][j];
}
}
memset(dp, 0, sizeof(dp));
/** NOTE : ์์์ ์ dp๊ฐ์ 1๋ก ์ค์ ํ๋ค */
dp[0][0] = 1;
for (int y=0; y<N; ++y) {
for (int x=0; x<N; ++x) {
/**
* NOTE
* - dp๊ฐ์ด ๊ฐฑ์ ์ด ๋์ง ์์๋ค๋ฉด ๋๋ฌํ์ง ๋ชปํ๋ ๊ฒฝ๋ก์ด๋ฏ๋ก ํจ์คํ๋ค
* - ์ข
์ฐฉ์ญ์ด๋ฉด ํจ์คํ๋ค
*/
if (dp[y][x] == 0 || (y == N-1 && x == N-1)) continue;
int d = map[y][x];
/** NOTE : ๋ฏธ๋์ dp๊ฐ์ ๋์ ๊ฐฑ์ */
if (y+d < N) dp[y+d][x] += dp[y][x];
if (x+d < N) dp[y][x+d] += dp[y][x];
}
}
cout << dp[N-1][N-1];
return 0;
}
9466. ํ ํ๋ก์ ํธ
๋ฌธ์ ์์ฝ
ํ์๋ค์ ํ
ํ๋ก์ ํธ๋ฅผ ์ํํด์ผ ํ๋ค.
๊ฐ๊ฐ์ ํ์์ 1๋ถํฐ n๊น์ง ๋ฒํธ๊ฐ ๋ถ์ฌ๋๋ค.
๋ชจ๋ ํ์๋ค์ ํ์ ๊ตฌ์ฑํ๊ธฐ ์ํด ํจ๊ปํ๊ณ ์ถ์ ํ์์ ์ ํํด์ผ ํ๋ฉฐ,
๋จ ํ ๋ช
๋ง ์ ํํ ์ ์๋ค.
์๊ธฐ ์์ ์ ์ ํํ๋ ๊ฒฝ์ฐ๋ ๊ฐ๋ฅํ๋ค.
ํ์ด ๋๊ธฐ ์ํ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ๋ค.
ํ์๋ค์ด(s1, s2, ..., sr)์ด๊ณ r=1์ธ ๊ฒฝ์ฐ์
- s1์ด s1์ ์ ํํ๋ ๊ฒฝ์ฐ
- s1์ด s2๋ฅผ ์ ํํ๊ณ , s2๊ฐ s3๋ฅผ ์ ํํ๊ณ , ... , sr-1์ด sr์ ์ ํํ๊ณ , sr์ด s1์ ์ ํํ๋ ๊ฒฝ์ฐ
์๋ฅผ ๋ค์ด, ํ ๋ฐ์ 7๋ช ์ ํ์์ด ์๊ณ ์ ํ์ ๊ฒฐ๊ณผ๊ฐ ๋ค์๊ณผ ๊ฐ๋ค๊ณ ํด๋ณด์.

์์ ๊ฒฐ๊ณผ๋ฅผ ํตํด (3)๊ณผ (4, 7, 6)์ด ํ์ ์ด๋ฃฐ ์ ์๋ค.
1, 2, 5๋ ์ด๋ ํ์๋ ์ํ์ง ์๋๋ค.
์ ํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ์,
์ด๋ ํ์๋ ์ํ์ง ์๋ ํ์๋ค์ ์๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ณด์.
(์์ ์ ๋ ฅ)
2 => ํ ์คํธ ์ผ์ด์ค ์
7 => ํ์ ์
3 1 3 7 3 4 6 => ์ ํ ๊ฒฐ๊ณผ
8
1 2 3 4 5 6 7 8
ํด์ค & ์ ์ฒด ์ฝ๋
์ผ๋ฐ์ ์ธ ๋ฐฉ์์ผ๋ก ์์ ํ์์ ํ๋ฉฐ
cycle์ ๋ชจ๋ ์ฐพ์๋ด๋ ค๊ณ ํ๋ฉด ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
์ด๋ฏธ cycle๋ก ํ๋ช
๋ ํ์๋ค์ ๋ํด ๋์ผํ ์ฐ์ฐ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ.
๊ทธ๋์ ๋ณดํต dfs๋ฅผ ํ ๋ ์ฐ๋ visited ์ ๋ํด์
cycle ์ด๋ผ๋ ๋ฐฐ์ด์ ์ถ๊ฐ๋ก ์ ์ธํด์ฃผ์ด
๋ณด๋ค ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
#include <iostream>
#include <cstring>
#define MAX 100001
using namespace std;
int choice[MAX];
bool visited[MAX];
bool cycle[MAX];
int n;
int cnt;
void dfs(int cur) {
visited[cur] = true;
int next = choice[cur];
if (visited[next]) {
// NOTE : ๋ฐฉ๋ฌธ์ด ๋์์๋ cycle๋ก ๋งํน๋์ง ์์์ด์ผ๋ง ์ฌ์ดํด๋ก ์นด์ดํ
ํ๋ค
if (!cycle[next]) {
for (int i=next; i!=cur; i=choice[i]) ++cnt;
++cnt;
}
}
else dfs(next);
/**
* NOTE
* - ์ ํํ ํ์์ ๋ํ dfs๋ฅผ ๋๋ด๊ณ ๋์์ผ cycle ๋งํน
* - ์์์๋ cnt๋ฅผ ์ธ๋ ๋ถ๋ถ์์ flag๋ก ์ฌ์ฉ๋๋ค
*/
cycle[cur] = true;
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int T; cin >> T;
while (T--) {
cin >> n;
cnt = 0;
for (int i=1; i<=n; ++i) {
cin >> choice[i];
visited[i] = cycle[i] = false;
}
for (int i=1; i<=n; ++i) {
if (!visited[i]) dfs(i);
}
cout << n-cnt << '\n';
}
return 0;
}
Review
13335. ํธ๋ญ
16234. ์ธ๊ตฌ ์ด๋
11401. ์ดํญ ๊ณ์ 3
16967. ๋ฐฐ์ด ๋ณต์ํ๊ธฐ
1522. ๋ฌธ์์ด ๊ตํ
9527. 1์ ๊ฐ์ ์ธ๊ธฐ
9์ฃผ์ฐจ
๋ชฉ์ฐจ
- ME
- ํ์
14500. ํ ํธ๋ก๋ฏธ๋ ธ
๋ฌธ์ ์์ฝ
1 X 1์ธ ์ ์ฌ๊ฐํ์ 4๊ฐ ์ด์ด์ ๋ถ์ธ ๋ํ๋ค ์ค
์๋ 5๊ฐ์ ๋ํ์ ํ
ํธ๋ก๋ฏธ๋
ธ๋ผ๊ณ ํ๋ค.

ํฌ๊ธฐ๊ฐ N X M ์ธ ์ข
์ด ์์ ํ
ํธ๋ก๋ฏธ๋
ธ๋ฅผ ํ๋ ๋๋ ์ํฉ์ ์๊ฐํ์.
๊ฐ๊ฐ์ ์นธ์๋ ์ ์๊ฐ ํ๋์ฉ ์ฐ์ฌ ์๋ค.
์ด๋, ํ
๋ฅด๋
ธ๋ฏธ๋
ธ ํ๋๋ฅผ ์ ์ ํ ๋์์
๋์ธ ์นธ์ ์๋ ์๋ค์ ํฉ์ ์ต๋๋ก ํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ณด์.
ํ ๋ฅด๋ ธ๋ฏธ๋ ธ๋ ํ์ ์ด๋ ๋์นญ์ ์์ผ๋ ๋๋ค.
(์์ ์ ๋ ฅ)
5 5 => ์ธ๋กํฌ๊ธฐ N, ๊ฐ๋กํฌ๊ธฐ M
1 2 3 4 5 => ์ข ์ด์ ์ฐ์ฌ ์๋ ์
5 4 3 2 1
2 3 4 5 6
6 5 4 3 2
1 2 1 2 1
ํด์ค
DFS + ์์ ํ์์ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๋ค
๋ค๋ง, 5๊ฐ์ ํ
๋ฅด๋
ธ๋ฏธ๋
ธ ๋ชจ์ ์ค์์
ใ
๋ชจ์์ DFS๋ก ํด๊ฒฐํ ์ ์๋ค.
๋ฐ๋ผ์ ์ด๊ฒ๋ง ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ฉด ๋๋ ๋ฌธ์ .
1. ์ ๋ ฅ
int N,M;
int map[MAX][MAX];
...
cin >> N >> M;
for (int i=0; i<N; ++i) {
for (int j=0; j<M; ++j) {
cin >> map[i][j];
}
}
2. main
๋ชจ๋ ์ง์ ์ ๋ํด์ dfs๋ฅผ ์งํํด์ค ๊ฒ์ด๋ค.
๋ํ ๋ชจ๋ ์ง์ ์์ ใ
๋ชจ์์ ๊ฒ์ฌํด์ค ๊ฒ์ด๋ค.
bool visited[MAX][MAX];
int ans = 0;
// void dfs(int y, int x, int cnt, int cur);
// void ooh(int y, int x);
...
for (int i=0; i<N; ++i) {
for (int j=0; j<M; ++j) {
visited[i][j] = true;
dfs(i, j, 1, map[i][j]);
visited[i][j] = false;
// ใ
ooh(i, j);
}
}
cout << ans;
3. dfs
depth๊ฐ 4์ผ๋ ํ์ถํด์ฃผ๋ ๊ฐ๋จํ dfs์ด๋ค.
ํ๋ผ๋ฏธํฐ๋ก ๊น์ด์ ํ
๋ฅด๋
ธ๋ฏธ๋
ธ ํฉ์ ์ ๋ฌํด์ฃผ๋ฉด์ ์ฒ๋ฆฌํ๋ค.
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};
int ans = 0;
bool visited[MAX][MAX];
...
bool check(int y, int x) {
return y>=0 && y<N && x>=0 && x<M;
}
void dfs(int y, int x, int cnt, int cur) {
if (cnt == 4) {
ans = max(ans, cur);
return;
}
for (int i=0; i<4; ++i) {
int ny = y+dy[i], nx = x+dx[i];
if (!check(ny, nx) || visited[ny][nx]) continue;
visited[ny][nx] = true;
dfs(ny, nx, cnt+1, cur+map[ny][nx]);
visited[ny][nx] = false;
}
}
4. ใ ๋ชจ์ ์ฒ๋ฆฌํ๊ธฐ
์ค์ฌ์ ๊ธฐ์ค์ผ๋ก ์๊ฐํ๋ค.
๊ฒฝ๊ณ์ ์์นํ๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด cnt๋ก ์นด์ดํ ์ ํ๋ค.
- cnt๊ฐ 3๋ณด๋ค ์์์ ๊ฒฝ์ฐ
- ใ ๋ชจ์์ด ์๋๋ฏ๋ก ์ฒ๋ฆฌํ์ง ์๋๋ค.
- cnt๊ฐ 3์ธ ๊ฒฝ์ฐ
- ใ ๋ชจ์์ด๋ฏ๋ก ๊ทธ๋๋ก ํ ๋นํ๋ค.
- cnt๊ฐ 4์ธ ๊ฒฝ์ฐ
- + ๋ชจ์์ด๋ฏ๋ก ๊ฐ์ฅ ์์ ๊ฐ์ ๋นผ์ค๋ค.
void ooh(int y, int x) {
int sum = map[y][x];
int cnt = 0;
int tmp = 1001;
for (int i=0; i<4; ++i) {
int ny = y+dy[i], nx = x+dx[i];
if (!check(ny, nx)) continue;
++cnt;
sum += map[ny][nx];
tmp = min(tmp, map[ny][nx]);
}
if (cnt < 3) return;
if (cnt == 3) {
ans = max(ans, sum);
return;
}
// cnt == 4
ans = max(ans, sum - tmp);
}
์ ์ฒด ์ฝ๋
#include <iostream>
using namespace std;
#define MAX 500
int N,M;
int map[MAX][MAX];
bool visited[MAX][MAX];
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};
int ans = 0;
bool check(int y, int x) {
return y>=0 && y<N && x>=0 && x<M;
}
void dfs(int y, int x, int cnt, int cur) {
if (cnt == 4) {
ans = max(ans, cur);
return;
}
for (int i=0; i<4; ++i) {
int ny = y+dy[i], nx = x+dx[i];
if (!check(ny, nx) || visited[ny][nx]) continue;
visited[ny][nx] = true;
dfs(ny, nx, cnt+1, cur+map[ny][nx]);
visited[ny][nx] = false;
}
}
void ooh(int y, int x) {
int sum = map[y][x];
int cnt = 0;
int tmp = 1001;
for (int i=0; i<4; ++i) {
int ny = y+dy[i], nx = x+dx[i];
if (!check(ny, nx)) continue;
++cnt;
sum += map[ny][nx];
tmp = min(tmp, map[ny][nx]);
}
if (cnt < 3) return;
if (cnt == 3) {
ans = max(ans, sum);
return;
}
// cnt == 4
ans = max(ans, sum - tmp);
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N >> M;
for (int i=0; i<N; ++i) {
for (int j=0; j<M; ++j) {
cin >> map[i][j];
}
}
for (int i=0; i<N; ++i) {
for (int j=0; j<M; ++j) {
visited[i][j] = true;
dfs(i, j, 1, map[i][j]);
visited[i][j] = false;
// ใ
ooh(i, j);
}
}
cout << ans;
return 0;
}
1992. ์ฟผ๋ํธ๋ฆฌ
๋ฌธ์ ์์ฝ
ํ๋ฐฑ์์์ ์์ถํ๋๋ฐ ์ฌ์ฉ๋๋ ์ฟผ๋ํธ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์์์ ์์ถํ๋ค.
- ์์์ด ๋ชจ๋ 0์ผ๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ค๋ฉด ์์ถ ๊ฒฐ๊ณผ๋ "0"์ด ๋๋ค.
- ์์์ด ๋ชจ๋ 1๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ค๋ฉด ์์ถ ๊ฒฐ๊ณผ๋ "1"์ด ๋๋ค.
์์ถํ ๋๋ ์ผ์ชฝ ์, ์ค๋ฅธ์ชฝ ์, ์ผ์ชฝ ์๋, ์ค๋ฅธ์ชฝ ์๋๋ก
์์ญ์ ๋๋๊ณ ์์ถํ๊ฒ ๋๋ค.
์
๋ ฅ์ ์์์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ N์ด ์ฃผ์ด์ง๋ฉฐ,
ํญ์ 2์ ์ ๊ณฑ์๋ก ์ฃผ์ด์ง๋ค.
๊ทธ๋ค์ N๊ฐ์ ์ค์ ๊ฑธ์ณ์ 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง ๋ฌธ์์ด๋ค์ด ์ฃผ์ด์ง๋ค.
์ด๋ ์์์ ์์ถํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด๋ณด์.
(์์ ์ ๋ ฅ)
8
11110000
11110000
00011100
00011100
11110000
11110000
11110011
11110011
(์์ ์ถ๋ ฅ)
((110(0101))(0010)1(0001))
ํด์ค & ์ ์ฒด ์ฝ๋
์ฌ๊ท์ ์ผ๋ก ํด๊ฒฐํ ์ ์์์ ์๋ช
ํด๋ณด์ด๋,
๋ ๊ฐ์ ๊ฒฝ์ฐ dfs๋ฅผ ์ฒ์์ ๋ฆฌํดํ์
์ string์ผ๋ก ์ค์ ํ๋ ๋ฐ๋์
string์ฒ๋ฆฌ๊ฐ ๊น๋ค๋ก์ ํค๋ฉจ๋ค.
ํต์ฌ์ ๋ฆฌํด ํ์
์ void๋ก ์ค์ ํ๊ณ ,
์์ถ๊ฒฐ๊ณผ ์์ฒด๋ฅผ ๋งค๋ฒ ์ ๋ฌํ๋๊ฒ ์๋๋ผ
๊ทธ๋ฅ ๋ฐ๋ก ์ถ๋ ฅํด๋ฒ๋ฆฌ๋ ๊ฒ ๊ฐ๋ค.
#include <iostream>
#include <string>
using namespace std;
#define MAX 64
int N;
char map[MAX][MAX];
void dfs(int y, int x, int len) {
// NOTE : ๊ธธ์ด๊ฐ 1์ด๋ฉด ์์ถ ๋ถ๊ฐ๋ฅ
if (len == 1) {
cout << map[y][x];
return;
}
bool flag = true;
char c = map[y][x];
// NOTE : ๋ชจ๋ dfs ๊น์ด๋ง๋ค ์์ถ ๊ฐ๋ฅํ์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค
for (int i=y; i<y+len; ++i) {
for (int j=x; j<x+len; ++j) {
if (c != map[i][j]) {
flag = false;
break;
}
}
if (!flag) break;
}
// NOTE : ์์ถ ๊ฐ๋ฅํ๋ค๋ฉด...
if (flag) {
cout << c;
return;
}
// NOTE : ์ผ์ชฝ ์, ์ค๋ฅธ์ชฝ ์, ์ผ์ชฝ ์๋, ์ค๋ฅธ์ชฝ ์๋ ์์
cout << "(";
dfs(y, x, len/2);
dfs(y, x+len/2, len/2);
dfs(y+len/2, x, len/2);
dfs(y+len/2, x+len/2, len/2);
cout << ")";
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N;
for (int i=0; i<N; ++i) {
for (int j=0; j<N; ++j) {
cin >> map[i][j];
}
}
dfs(0, 0, N);
return 0;
}
Review
16918. ๋ด๋ฒ๋งจ
4991. ๋ก๋ด ์ฒญ์๊ธฐ
2217. ๋กํ
1113. ์์์ฅ ๋ง๋ค๊ธฐ
19238. ์คํํธ ํ์
17615. ๋ณผ ๋ชจ์ผ๊ธฐ
8์ฃผ์ฐจ
๋ชฉ์ฐจ
- ME
- ํ์
13460. ๊ตฌ์ฌ ํ์ถ 2
๋ฌธ์ ์์ฝ
์ธ๋ก ํฌ๊ธฐ N, ๊ฐ๋ก ํฌ๊ธฐ M์ ๋ณด๋๊ฐ ์ฃผ์ด์ง๋ค.
๋ณด๋์๋ ๊ตฌ๋ฉ์ด ํ๋ ์๋ค.
๊ตฌ์ฌ ํ์ถ์ ์ด๋ฐ ๋ณด๋๊ฐ ์ฃผ์ด์ก์ ๋,
ํ๋ ๊ตฌ์ฌ, ๋นจ๊ฐ ๊ตฌ์ฌ์ ํ๋์ฉ ๋ฃ์ ๋ค ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ด๋ ๊ฒ์.
(๋จ, ํ๋ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ๋ฉด ์๋๋ค.)
๊ตฌ์ฌ์ ์ค๋ ฅ์ ์ด์ฉํด์ ์ด๋ฆฌ ์ ๋ฆฌ ๊ตด๋ ค์ผ ํ๋ฉฐ
์ํ์ข์ฐ๋ก ๊ธฐ์ธ์ด๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค
๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํ ์นธ์ ์์ ์ ์๊ณ ,
๋นจ๊ฐ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ง๋ฉด ์ฑ๊ณต์ด์ง๋ง,
ํ๋ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ง๋ฉด ์คํจ์ด๋ค.
๋ณด๋์ ์ํ๊ฐ ์ฃผ์ด์ง ๋,
์ต์ ๋ช ๋ฒ ๋ง์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด
๋นผ๋ผ ์ ์๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ณด์.
๋ง์ฝ, 10๋ฒ ์ดํ๋ก ์์ง์ฌ์
๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ผ ์ ์์ผ๋ฉด -1์ ์ถ๋ ฅํ๋ค.
์์์ ๋ ฅ
<!-- R : ๋นจ๊ฐ ๊ตฌ์ฌ, B : ํ๋ ๊ตฌ์ฌ, . : ๋น์นธ, # : ๋ฒฝ, O : ๊ตฌ๋ฉ -->
5 5 => N, M
##### => ๋ณด๋
#..B#
#.#.#
#RO.#
#####
ํด์ค
DFS ๋ฅผ ์ด์ฉํ ์์ ํ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ์ด๋ค.
1. ์ ๋ ฅ
#define MAX 10
struct pos {
int y; int x;
};
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};
int N, M;
char board[MAX][MAX];
int ans = INT_MAX;
...
// main
cin >> N >> M;
pos r,b;
for (int i=0; i<N; ++i) {
for (int j=0; j<M; ++j) {
cin >> board[i][j];
if (board[i][j] == 'R') r = {i, j};
else if (board[i][j] == 'B') b = {i, j};
}
}
์ขํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ pos ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ธํด์ค๋ค.
๋นจ๊ฐ๊ตฌ์ฌ, ํ๋๊ตฌ์ฌ์ ์
๋ ฅ๋ฐ๋ ์์ ์ ๋ฏธ๋ฆฌ ๊ธฐ๋กํด๋๋ฉฐ,
์ด๋ฅผ r , b ์ ์ ์ฅํ๋ค.
1.5 DFS ์ง์ ์ main
// DFS ์๊ทธ๋์ฒ
void dfs(pos red, pos blue, int cnt, int dir);
// main
for (int i=0; i<4; ++i) {
dfs(r, b, 1, i);
}
if (ans == INT_MAX || ans > 10) ans = -1;
cout << ans;
4๋ฐฉํฅ์ผ๋ก ๊ธฐ์ธ์ผ ์ ์์ผ๋ฏ๋ก 4๊ฐ์ง dfs ์ง์
๋ฐฉ์์ด ์กด์ฌํ ์ ์๋ค.
๋ฐ๋ผ์ main์์ ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ dfs ์ฝ์ 4๋ฒ์ ํด์ค๋ค.
DFS ๋ ํ๋ผ๋ฏธํฐ๋ก
- ํ์ฌ ๋นจ๊ฐ ๊ตฌ์ฌ ์ขํ red
- ํ์ฌ ํ๋ ๊ตฌ์ฌ ์ขํ blue
- ๋ณด๋๋ฅผ ๊ธฐ์ธ์ธ ํ์ cnt
- ๋ณด๋๋ฅผ ๊ธฐ์ธ์ธ ๋ฐฉํฅ dir
์ ์ ๋ฌํ๋ค.
์ถ๋ ฅ์
DFS๋ฅผ ํตํด ans๋ฅผ ๊ฐฑ์ ํ๋ค main์ผ๋ก ๋์์
ans๊ฐ INT_MAX ์์ ๋ณํ์ง ์์๊ฑฐ๋
10์ ์ด๊ณผํ๋ค๋ฉด -1์ ์ถ๋ ฅํ๋ ์ผ๋ฐ์ ์ธ ํํ์ด๋ค.
2. DFS
ํต์ฌ์
- ์ผ๋จ ๋นจ / ํ ๊ตฌ์ฌ์ ์ผ๋จ ๊ฐ๊ฐ ์ด๋
- ๊ตฌ๋ฉ์ ๋น ์ก๋์ง ์ฌ๋ถ๋ฅผ ํ์ธ
- ์ผ๋จ ์ด๋์ํจ ๋ค์ ๊ฒฐ๊ณผ๊ฐ ๊ฒน์น๊ฒ ๋์์ ๋ ์์น๋ฅผ ๋ณด์
์ ๋ด์ฉ๋ค์ ์งํค๋ฉฐ ์์ ํ์์ ํด์ฃผ๋๊ฒ ์ค์ํ๋ ๊ฒ ๊ฐ๋ค.
int count(int cy, int ncy, int cx, int ncx) {
return abs(cy-ncy) + abs(cx-ncx);
}
int inverse(int dir) {
int inv;
switch (dir)
{
case 0:
inv = 1;
break;
case 1:
inv = 0;
break;
case 2:
inv = 3;
break;
case 3:
inv = 2;
break;
}
return inv;
}
void dfs(pos red, pos blue, int cnt, int dir) {
if (cnt > 10 || cnt >= ans) return;
// NOTE : ๋นจ๊ฐ ๊ตฌ์ฌ์ด ํ์ถํ๋์ง ํ์ธํ๋ค
int nry = red.y, nrx = red.x;
bool red_out = false;
while (1) {
nry += dy[dir]; nrx += dx[dir];
if (board[nry][nrx] == '#') break;
if (board[nry][nrx] == 'O') {
red_out = true;
break;
}
}
// NOTE : # or O => . ์์น๋ก ํ์นธ ๋ณด์
nry -= dy[dir]; nrx -= dx[dir];
// NOTE : ํ๋ ๊ตฌ์ฌ์ด ํ์ถํ๋์ง ํ์ธํ๋ค
int nby = blue.y, nbx = blue.x;
while (1) {
nby += dy[dir]; nbx += dx[dir];
if (board[nby][nbx] == '#') break;
// NOTE : ํ๋ ๊ตฌ์ฌ์ด ํ์ถ ํ๋ค๋ฉด ๋ฐ๋ก ํ์์ ์ข
๋ฃํ๋ค
if (board[nby][nbx] == 'O') {
return;
}
}
// NOTE : # or O => . ์์น๋ก ํ์นธ ๋ณด์
nby -= dy[dir]; nbx -= dx[dir];
// NOTE : ๋นจ๊ฐ ๊ตฌ์ฌ์ด ํ์ถํ๋ค๋ฉด ans๋ฅผ ๊ฐฑ์ ํ๋ค
if (red_out) {
ans = min(ans, cnt);
return;
}
/**
* NOTE
* - ๋นจ๊ฐ / ํ๋ ๊ตฌ์ฌ์ ๊ฐ์ ์นธ์ ์กด์ฌํ ์ ์๋ค
* - ํ์ง๋ง ๋นจ/ํ ๊ตฌ์ฌ์ ๋ํด ๊ฐ๊ฐ while์ ๋๋ฆฌ๊ณ ์์ผ๋ฏ๋ก ๊ฐ์ด ๊ฐ์์ง๋ ์ํฉ์ด ๋์ค๊ฒ ๋๋ค
* - ๋ฐ๋ผ์ ๊ฐ์ด ๊ฐ์์ ๊ฒฝ์ฐ ์ด๋ํ ๊ฑฐ๋ฆฌ๊ฐ ํฐ ์ชฝ์ ํ์นธ ๋ณด์ ํด์ค๋ค
*/
if ((nry == nby) && (nrx == nbx)) {
int rd = count(red.y, nry, red.x, nrx);
int bd = count(blue.y, nby, blue.x, nbx);
// NOTE : ๊ธฐ์ธ์์ ๋ ๋ ๋ง์ด ์์ง์๋ค๋ฉด ํ์นธ ๋๋๋ ค ์ค์ผ ํ๋ค
if (rd > bd) { nry -= dy[dir]; nrx -= dx[dir]; }
else { nby -= dy[dir]; nbx -= dx[dir]; }
}
for (int i=0; i<4; ++i) {
// NOTE : ์ด์ ๋ฑกํฅ๊ณผ ๋๊ฐ์ ๋ฐฉํฅ or ๋ฐ๋๋ฐฉํฅ (๋๋์๊ฐ๋) ์ ์๋ฏธ๊ฐ ์๋ค
if (i == dir || i == inverse(dir)) continue;
pos nr = {nry, nrx}, nb = {nby, nbx};
dfs(nr, nb, cnt+1, i);
}
}
์ ์ฒด ์ฝ๋
#include <iostream>
#include <queue>
#include <vector>
#include <climits>
using namespace std;
#define MAX 10
struct pos {
int y; int x;
};
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};
int N, M;
char board[MAX][MAX];
int ans = INT_MAX;
int count(int cy, int ncy, int cx, int ncx) {
return abs(cy-ncy) + abs(cx-ncx);
}
int inverse(int dir) {
int inv;
switch (dir)
{
case 0:
inv = 1;
break;
case 1:
inv = 0;
break;
case 2:
inv = 3;
break;
case 3:
inv = 2;
break;
}
return inv;
}
void dfs(pos red, pos blue, int cnt, int dir) {
if (cnt > 10 || cnt >= ans) return;
// NOTE : ๋นจ๊ฐ ๊ตฌ์ฌ์ด ํ์ถํ๋์ง ํ์ธํ๋ค
int nry = red.y, nrx = red.x;
bool red_out = false;
while (1) {
nry += dy[dir]; nrx += dx[dir];
if (board[nry][nrx] == '#') break;
if (board[nry][nrx] == 'O') {
red_out = true;
break;
}
}
// NOTE : # or O => . ์์น๋ก ํ์นธ ๋ณด์
nry -= dy[dir]; nrx -= dx[dir];
// NOTE : ํ๋ ๊ตฌ์ฌ์ด ํ์ถํ๋์ง ํ์ธํ๋ค
int nby = blue.y, nbx = blue.x;
while (1) {
nby += dy[dir]; nbx += dx[dir];
if (board[nby][nbx] == '#') break;
// NOTE : ํ๋ ๊ตฌ์ฌ์ด ํ์ถ ํ๋ค๋ฉด ๋ฐ๋ก ํ์์ ์ข
๋ฃํ๋ค
if (board[nby][nbx] == 'O') {
return;
}
}
// NOTE : # or O => . ์์น๋ก ํ์นธ ๋ณด์
nby -= dy[dir]; nbx -= dx[dir];
// NOTE : ๋นจ๊ฐ ๊ตฌ์ฌ์ด ํ์ถํ๋ค๋ฉด ans๋ฅผ ๊ฐฑ์ ํ๋ค
if (red_out) {
ans = min(ans, cnt);
return;
}
/**
* NOTE
* - ๋นจ๊ฐ / ํ๋ ๊ตฌ์ฌ์ ๊ฐ์ ์นธ์ ์กด์ฌํ ์ ์๋ค
* - ํ์ง๋ง ๋นจ/ํ ๊ตฌ์ฌ์ ๋ํด ๊ฐ๊ฐ while์ ๋๋ฆฌ๊ณ ์์ผ๋ฏ๋ก ๊ฐ์ด ๊ฐ์์ง๋ ์ํฉ์ด ๋์ค๊ฒ ๋๋ค
* - ๋ฐ๋ผ์ ๊ฐ์ด ๊ฐ์์ ๊ฒฝ์ฐ ์ด๋ํ ๊ฑฐ๋ฆฌ๊ฐ ํฐ ์ชฝ์ ํ์นธ ๋ณด์ ํด์ค๋ค
*/
if ((nry == nby) && (nrx == nbx)) {
int rd = count(red.y, nry, red.x, nrx);
int bd = count(blue.y, nby, blue.x, nbx);
// NOTE : ๊ธฐ์ธ์์ ๋ ๋ ๋ง์ด ์์ง์๋ค๋ฉด ํ์นธ ๋๋๋ ค ์ค์ผ ํ๋ค
if (rd > bd) { nry -= dy[dir]; nrx -= dx[dir]; }
else { nby -= dy[dir]; nbx -= dx[dir]; }
}
for (int i=0; i<4; ++i) {
// NOTE : ์ด์ ๋ฑกํฅ๊ณผ ๋๊ฐ์ ๋ฐฉํฅ or ๋ฐ๋๋ฐฉํฅ (๋๋์๊ฐ๋) ์ ์๋ฏธ๊ฐ ์๋ค
if (i == dir || i == inverse(dir)) continue;
pos nr = {nry, nrx}, nb = {nby, nbx};
dfs(nr, nb, cnt+1, i);
}
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N >> M;
pos r,b;
for (int i=0; i<N; ++i) {
for (int j=0; j<M; ++j) {
cin >> board[i][j];
if (board[i][j] == 'R') r = {i, j};
else if (board[i][j] == 'B') b = {i, j};
}
}
for (int i=0; i<4; ++i) {
dfs(r, b, 1, i);
}
if (ans == INT_MAX || ans > 10) ans = -1;
cout << ans;
return 0;
}
17143. ๋์์
๋ฌธ์ ์์ฝ

ํ์ด R๊ฐ, ์ด์ด C๊ฐ์ธ ๊ฒฉ์ํ์ด ์๋ค.
๊ฐ ์นธ์๋ ์์ด๊ฐ ์ต๋ ํ ๋ง๋ฆฌ ๋ค์ด์์ ์ ์๊ณ , ํฌ๊ธฐ ๋ฐ ์๋๋ฅผ ์ง๋๋ค.
๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋์์์ ์ฒ์ 1๋ฒ ์ด์ ํ ์นธ ์ผ์ชฝ์ ์์นํด ์๋ค.
๋์์์ด ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์ด์ ์ค๋ฅธ์ชฝ ๋๊น์ง ์ด๋ํ๋ฉด ๊ฒ์์ด ๋๋๋ค.
๋์์์ 1์ด์ ํ ์นธ์ฉ ์ด๋ํ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ์ผ๋ค์ด ์์๋๋ก ์ผ์ด๋๋ค.
- ๋์์์ด ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ์ด๋ํ๋ค
- ๋์์์ด ์๋ ์ด์ ์๋ ์์ด ์ค ๋ ๊ณผ ์ ์ผ ๊ฐ๊น์ด ์์ด๋ฅผ ์ก๋๋ค
- ์์ด๊ฐ ์ด๋ํ๋ค
์์ด๋ ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์๋๋ก ์ด๋ํ๊ณ , ๋จ์๋ ์นธ/์ด ์ด๋ค.
๋ง์ฝ ์ด๋ํ๋ ค๋ ์นธ์ด ๊ฒฉ์ํ์ ๊ฒฝ๊ณ๋ฅผ ๋๋ ๊ฒฝ์ฐ์๋
๋ฐฉํฅ์ ๋ฐ๋๋ก ๋ฐ๊ฟ์ ์ด๋ํ๋ค.
์์ด๊ฐ ์ด๋์ ๋ง์น ํ์ ํ ์นธ์ ์์ด๊ฐ ๋ ๋ง๋ฆฌ ์ด์ ์กด์ฌ ๊ฐ๋ฅํ๋ฉฐ,
์ด ๊ฒฝ์ฐ ํฌ๊ธฐ๊ฐ ๊ฐ์ฅ ํฐ ์์ด๋ง์ด ์ด์๋จ๋๋ค.
๊ฒฉ์ํ์ด ์ฃผ์ด์ก์ ๋, ๋์์์ด ์ก์ ์์ด ํฌ๊ธฐ์ ํฉ์ ๊ตฌํด๋ณด์.
์์์ ๋ ฅ
4 6 8 => R C M(์์ด์ ์)
4 1 3 3 8 => r c s d z (r,c : ์์ด์ ์์น, s : ์๋, d : ์ด๋๋ฐฉํฅ, z : ํฌ๊ธฐ)
1 3 5 2 9
2 4 8 4 1
4 5 0 1 4
3 3 1 2 7
1 5 8 4 3
3 6 2 1 2
2 2 2 3 5
ํด์ค
0. ์๋ก
๋์์์ด ๋์ํ๋ ํ๋ฆ์ ๋ค์ ์๊ธฐํด๋ณด๋ฉด
- ๋์์์ ์ด๋
- ์์ด ํฌํ
- ์์ด ์ด๋
- ์์ด๋ผ๋ฆฌ ํฌ์
์ด๋ ๊ฒ ์ ๋ฆฌํ ์ ์๋ค.
์ด๋ฅผ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ก ๋์์์ผ๋ณด๋ ค๊ณ ํ๋ค.
int fisher = 1;
...
// main
for (; fisher<=C; ++fisher) {
if (is_over()) break;
fish();
move();
eat();
}
- ๋์์์ ์ด๋
- for-loop ์ ํด๋น
- ์์ด ํฌํ
- fish() ํจ์์ ํด๋น
- ์์ด ์ด๋
- move() ํจ์์ ํด๋น
- ์์ด๋ผ๋ฆฌ ํฌ์
- eat() ํจ์์ ํด๋น
fisher ๊ฐ C ๋ฅผ ๋์ด๊ฐ๊ธฐ ์ ๊น์ง ์ด๋ฅผ ๋ฐ๋ณตํด์ฃผ๋ฉด ๋๋ ๋ฌธ์ ์ด๋ค.
is_over ๋ฅผ ํตํด ์์ด๋ฅผ ๋ชจ๋ ์ก์๋์ง ํ์ธํ๋ค.
1. ์ ๋ ฅ
#define MAX 101
struct shark {
int id;
int y; int x;
int speed;
int dir;
int size;
bool is_dead;
};
int R,C,M;
vector<shark> sharks;
vector<int> map[MAX][MAX];
...
// main
cin >> R >> C >> M;
int r,c,speed,dir,size;
for (int i=0; i<M; ++i) {
cin >> r >> c >> speed >> dir >> size;
sharks.push_back({i, r, c, speed, dir, size, false});
map[r][c].push_back(i);
}
์ฃผ๋ชฉํด์ผํ ์ง์ ๋ค์ด ์กด์ฌํ๋ค.
์ฒซ๋ฒ์งธ๋, shark๋ก ํ์ฌ๊ธ ์๋ณํ ์ ์๋ id ๋ฅผ ๊ฐ์ง๊ฒ ํ๋ ๊ฒ์ด๋ค.
๋๋ฒ์งธ๋, shark๊ฐ ์ด๋ ํ์ ์๋ก ๊ฒน์น๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ,
map ์ vector(์ปจํ
์ด๋) ํ์
์ ์ฌ์ฉํ์ฌ ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค.
shark์ id๋ฅผ ํตํด ์ ์ฐํ๊ฒ ๊ด๋ฆฌํ ์ ์๊ฒ ๋๋ค.
๋ง์ง๋ง์ผ๋ก, shark์๊ฒ is_dead ๋ผ๋ ํ๋๊ทธ๋ฅผ ๊ฐ์ง๊ฒ ํด์
์ง์ shark๋ฅผ ์ปจํ
์ด๋์์ ์ญ์ ํ๋ ์ฐ์ฐ์ ํ์ง ์๋ ์ ์ด๋ค.
2. fish : ์์ด ํฌํ
int ans = 0;
void fish() {
// NOTE : ๋์๊พผ์ ์ง๋ฉด๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณณ๋ถํฐ ๋์๋ฅผ ์์ํ๋ค
for (int i=1; i<=R; ++i) {
// NOTE : shark id๊ฐ ๋ด๊ฒจ์๋ ์์น๋ฅผ ์ฐพ๋๋ค
if (!map[i][fisher].empty()) {
int shark_id = map[i][fisher][0];
ans += sharks[shark_id].size;
// NOTE : ํฌํํ๊ธฐ ๋๋ฌธ์ ์ฃฝ์๋ค๊ณ ํ๊ธฐํ๊ณ ํด๋น ์์น์ map์ ๋น์์ค๋ค
sharks[shark_id].is_dead = true;
map[i][fisher].clear();
break;
}
}
}
shark ์์ฒด๋ฅผ ๊ด๋ฆฌํ์ง ์๊ณ , id๋ง์ ํตํด ๊ด๋ฆฌํ๋ ๋๋ถ์
fish์ ๊ณผ์ ์ด ์ฌ์์ง๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
3. move : ์์ด ์ด๋
// NOTE : <dummy>, UP, DOWN, RIGHT, LEFT
int dy[] = {-9, -1, 1, 0, 0};
int dx[] = {-9, 0, 0, 1, -1};
int inverse_dir(int dir) {
if (dir == 1) return 2;
else if (dir == 2) return 1;
else if (dir == 3) return 4;
else return 3;
}
void move() {
for (const auto& shark : sharks) {
// NOTE : ํฌํ๋ ์์ด๋ ๊ณ ๋ คํ์ง ์๋๋ค
if (shark.is_dead) continue;
int y = shark.y, x = shark.x;
// NOTE : ์ด์ ์ด๋ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ์์น์ shark id ์ปจํ
์ด๋๋ ๋น์์ค๋ค
map[y][x].clear();
}
for (auto& shark : sharks) {
// NOTE : ์ฃฝ์ ์์ด๋ ์ด๋์ํค์ง ์๋๋ค
if (shark.is_dead) continue;
int y = shark.y, x = shark.x, dir = shark.dir, speed = shark.speed;
int ny = y, nx = x;
// NOTE : ์ด๋ ๋ฐฉํฅ์ด UP or DOWN
if (dir == 1 || dir == 2) {
/**
* NOTE
* - ์ด๋ ๋ฐฉํฅ์ด ์์๋๋๊น R์ด ๊ธฐ์ค์ด๋ค
* - ๊ธฐ์กด ๋ฐฉํฅ์ ์ ์งํ๋ฉฐ, ์๋์ ์์น๋ก ๋์์ค๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ฃผ๊ธฐ๋ 2 * (R-1)์ด๋ค
*/
int period = 2 * (R-1);
if (speed >= period) speed %= period;
for (int i=0; i<speed; ++i) {
// NOTE : ์ผ๋จ ๊ฐฑ์ ์ ํ๊ณ , ์์น ๋ณด์ ์ ํ๋ค
ny += dy[dir]; nx += dx[dir];
if (ny < 1) {
ny += 2;
dir = inverse_dir(dir);
}
else if (ny > R) {
ny -= 2;
dir = inverse_dir(dir);
}
}
}
// NOTE : ์ด๋ ๋ฐฉํฅ์ด RIGHT or LEFT
else {
/**
* NOTE
* - ์ด๋ ๋ฐฉํฅ์ด ์์๋๋๊น C๊ฐ ๊ธฐ์ค์ด๋ค
* - ๊ธฐ์กด ๋ฐฉํฅ์ ์ ์งํ๋ฉฐ, ์๋์ ์์น๋ก ๋์์ค๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ฃผ๊ธฐ๋ 2 * (C-1)์ด๋ค
*/
int period = 2 * (C-1);
if (speed >= period) speed %= period;
for (int i=0; i<speed; ++i) {
// NOTE : ์ผ๋จ ๊ฐฑ์ ์ ํ๊ณ , ์์น ๋ณด์ ์ ํ๋ค
ny += dy[dir]; nx += dx[dir];
if (nx < 1) {
nx += 2;
dir = inverse_dir(dir);
}
else if (nx > C) {
nx -= 2;
dir = inverse_dir(dir);
}
}
}
// NOTE : ์๋กญ๊ฒ ๊ฐฑ์ ํ ์ขํ ์๋ฆฌ์ shark id๋ฅผ ๋ฃ์ด์ค๋ค
shark.y = ny;
shark.x = nx;
shark.dir = dir;
map[ny][nx].push_back(shark.id);
}
}
๊ฐ์ฅ ์ค์ํ ์ง์ ์
- ์/์๋ ์ด๋์ผ ๊ฒฝ์ฐ, 2 * (R-1)
- ์ค๋ฅธ์ชฝ/์ผ์ชฝ ์ด๋์ผ ๊ฒฝ์ฐ, 2 * (C-1)
ํ์ฌ ์์ด๊ฐ ์์ ์ ๋ฐฉํฅ์ ์ ์งํ๋ฉฐ ์๋ ์์น๋ก ๋์์ค๋ ์ฃผ๊ธฐ๊ฐ
์์ ๊ฐ์ด ๋๋ค๋ ๊ฒ์ ํ์
ํ๋ ๊ฒ์ด๋ค.
4. eat : ์์ด๋ผ๋ฆฌ ํฌ์
// NOTE : size ๊ธฐ์ค์ผ๋ก shark id๋ฅผ ๋ด๋ฆผ ์ฐจ์ ์ ๋ ฌํ๋ค
bool cmp(int a, int b) {
return sharks[a].size > sharks[b].size;
}
void eat() {
for (int i=1; i<=R; ++i) {
for (int j=1; j<=C; ++j) {
if (map[i][j].size() > 1) {
sort(map[i][j].begin(), map[i][j].end(), cmp);
// NOTE : ๊ฐ์ฅ size๊ฐ ํฐ shark์ id
int max_size_shark_id = map[i][j][0];
// NOTE : ๋ค๋ฅธ ์์ด๋ค์ ๊ฐ์ฅ ํฐ ์์ด์๊ฒ ๋ชจ๋ ์ก์๋จนํ๋ค (is_dead = true)
for (int k=1; k<map[i][j].size(); ++k) {
int shark_id = map[i][j][k];
sharks[shark_id].is_dead = true;
}
// NOTE : ๋ชจ๋ ๋น์์ฃผ๊ณ ๊ฐ์ฅ size๊ฐ ํฐ ์์ด๋ง ๋จ๊ธด๋ค
map[i][j].clear();
map[i][j].push_back(max_size_shark_id);
}
}
}
}
id ๋ฅผ ํตํด์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์
์ก์๋จน๋ ๊ณผ์ ๋ํ ๊ตฌํํ๊ธฐ ํธ๋ฆฌํ๋ค.
5. is_over : ์์ด๋ฅผ ๋ชจ๋ ์ก์๋์ง
bool is_over() {
for (const auto& shark : sharks) {
if (!shark.is_dead) return false;
}
return true;
}
์ ์ฒด ์ฝ๋
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX 101
struct shark {
int id;
int y; int x;
int speed;
int dir;
int size;
bool is_dead;
};
// NOTE : <dummy>, UP, DOWN, RIGHT, LEFT
int dy[] = {-9, -1, 1, 0, 0};
int dx[] = {-9, 0, 0, 1, -1};
int R,C,M;
vector<shark> sharks;
vector<int> map[MAX][MAX];
int fisher = 1;
int ans = 0;
bool is_over() {
for (const auto& shark : sharks) {
if (!shark.is_dead) return false;
}
return true;
}
void fish() {
// NOTE : ๋์๊พผ์ ์ง๋ฉด๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณณ๋ถํฐ ๋์๋ฅผ ์์ํ๋ค
for (int i=1; i<=R; ++i) {
// NOTE : shark id๊ฐ ๋ด๊ฒจ์๋ ์์น๋ฅผ ์ฐพ๋๋ค
if (!map[i][fisher].empty()) {
int shark_id = map[i][fisher][0];
ans += sharks[shark_id].size;
// NOTE : ํฌํํ๊ธฐ ๋๋ฌธ์ ์ฃฝ์๋ค๊ณ ํ๊ธฐํ๊ณ ํด๋น ์์น์ map์ ๋น์์ค๋ค
sharks[shark_id].is_dead = true;
map[i][fisher].clear();
break;
}
}
}
int inverse_dir(int dir) {
if (dir == 1) return 2;
else if (dir == 2) return 1;
else if (dir == 3) return 4;
else return 3;
}
void move() {
for (const auto& shark : sharks) {
// NOTE : ํฌํ๋ ์์ด๋ ๊ณ ๋ คํ์ง ์๋๋ค
if (shark.is_dead) continue;
int y = shark.y, x = shark.x;
// NOTE : ์ด์ ์ด๋ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ์์น์ shark id ์ปจํ
์ด๋๋ ๋น์์ค๋ค
map[y][x].clear();
}
for (auto& shark : sharks) {
// NOTE : ์ฃฝ์ ์์ด๋ ์ด๋์ํค์ง ์๋๋ค
if (shark.is_dead) continue;
int y = shark.y, x = shark.x, dir = shark.dir, speed = shark.speed;
int ny = y, nx = x;
// NOTE : ์ด๋ ๋ฐฉํฅ์ด UP or DOWN
if (dir == 1 || dir == 2) {
/**
* NOTE
* - ์ด๋ ๋ฐฉํฅ์ด ์์๋๋๊น R์ด ๊ธฐ์ค์ด๋ค
* - ๊ธฐ์กด ๋ฐฉํฅ์ ์ ์งํ๋ฉฐ, ์๋์ ์์น๋ก ๋์์ค๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ฃผ๊ธฐ๋ 2 * (R-1)์ด๋ค
*/
int period = 2 * (R-1);
if (speed >= period) speed %= period;
for (int i=0; i<speed; ++i) {
// NOTE : ์ผ๋จ ๊ฐฑ์ ์ ํ๊ณ , ์์น ๋ณด์ ์ ํ๋ค
ny += dy[dir]; nx += dx[dir];
if (ny < 1) {
ny += 2;
dir = inverse_dir(dir);
}
else if (ny > R) {
ny -= 2;
dir = inverse_dir(dir);
}
}
}
// NOTE : ์ด๋ ๋ฐฉํฅ์ด RIGHT or LEFT
else {
/**
* NOTE
* - ์ด๋ ๋ฐฉํฅ์ด ์์๋๋๊น C๊ฐ ๊ธฐ์ค์ด๋ค
* - ๊ธฐ์กด ๋ฐฉํฅ์ ์ ์งํ๋ฉฐ, ์๋์ ์์น๋ก ๋์์ค๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ฃผ๊ธฐ๋ 2 * (C-1)์ด๋ค
*/
int period = 2 * (C-1);
if (speed >= period) speed %= period;
for (int i=0; i<speed; ++i) {
// NOTE : ์ผ๋จ ๊ฐฑ์ ์ ํ๊ณ , ์์น ๋ณด์ ์ ํ๋ค
ny += dy[dir]; nx += dx[dir];
if (nx < 1) {
nx += 2;
dir = inverse_dir(dir);
}
else if (nx > C) {
nx -= 2;
dir = inverse_dir(dir);
}
}
}
// NOTE : ์๋กญ๊ฒ ๊ฐฑ์ ํ ์ขํ ์๋ฆฌ์ shark id๋ฅผ ๋ฃ์ด์ค๋ค
shark.y = ny;
shark.x = nx;
shark.dir = dir;
map[ny][nx].push_back(shark.id);
}
}
// NOTE : size ๊ธฐ์ค์ผ๋ก shark id๋ฅผ ๋ด๋ฆผ ์ฐจ์ ์ ๋ ฌํ๋ค
bool cmp(int a, int b) {
return sharks[a].size > sharks[b].size;
}
void eat() {
for (int i=1; i<=R; ++i) {
for (int j=1; j<=C; ++j) {
if (map[i][j].size() > 1) {
sort(map[i][j].begin(), map[i][j].end(), cmp);
// NOTE : ๊ฐ์ฅ size๊ฐ ํฐ shark์ id
int max_size_shark_id = map[i][j][0];
// NOTE : ๋ค๋ฅธ ์์ด๋ค์ ๊ฐ์ฅ ํฐ ์์ด์๊ฒ ๋ชจ๋ ์ก์๋จนํ๋ค (is_dead = true)
for (int k=1; k<map[i][j].size(); ++k) {
int shark_id = map[i][j][k];
sharks[shark_id].is_dead = true;
}
// NOTE : ๋ชจ๋ ๋น์์ฃผ๊ณ ๊ฐ์ฅ size๊ฐ ํฐ ์์ด๋ง ๋จ๊ธด๋ค
map[i][j].clear();
map[i][j].push_back(max_size_shark_id);
}
}
}
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> R >> C >> M;
int r,c,speed,dir,size;
for (int i=0; i<M; ++i) {
cin >> r >> c >> speed >> dir >> size;
sharks.push_back({i, r, c, speed, dir, size, false});
map[r][c].push_back(i);
}
for (; fisher<=C; ++fisher) {
if (is_over()) break;
fish();
move();
eat();
}
cout << ans;
return 0;
}
Review
10844. ์ฌ์ด ๊ณ๋จ ์
15684. ์ฌ๋ค๋ฆฌ ์กฐ์
19941. ํ๋ฒ๊ฑฐ ๋ถ๋ฐฐ
1976. ์ฌํ ๊ฐ์
14889. ์คํํธ์ ๋งํฌ
2206. ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ
7์ฃผ์ฐจ : Dijkstra
๋ชฉ์ฐจ
- ME
- ํ์
1916. ์ต์๋น์ฉ ๊ตฌํ๊ธฐ
๋ฌธ์ ์์ฝ
N๊ฐ์ ๋์, M๊ฐ์ ๋ฒ์ค๊ฐ ์๋ค.
์
๋ ฅ์ผ๋ก ๋ฒ์ค์ ์ถ๋ฐ์ง์ ๋์ฐฉ์ง ์ฌ์ด์ ๋น์ฉ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค.
์ด๋ ์ฃผ์ด์ง ์ถ๋ฐ์ง -> ๋์ฐฉ์ง๋ก ๊ฐ๋ ์ต์๋น์ฉ์ ๊ตฌํด๋ณด์.
์์์ ๋ ฅ : 1๋ฒ ๋์์์ 5๋ฒ ๋์๋ก ๊ฐ๋ ์ต์๋น์ฉ์ ๊ตฌํ๋ฉด ๋๋ค
5 => ๋์์ ์ N
8 => ๋ฒ์ค์ ์ M
1 2 2 => 1๋ฒ ๋์์์ 2๋ฒ ๋์๋ก ๊ฐ๋ ๋น์ฉ : 2
1 3 3
1 4 1
1 5 10
2 4 2
3 4 1
3 5 1
4 5 3
1 5 => ์ถ๋ฐ์ง : 1๋ฒ, ๋์ฐฉ์ง : 5๋ฒ
ํด์ค & ์ ์ฒด ์ฝ๋
์ฐ์ ์์ ํ๋ก ํด๊ฒฐํ๋ ์ผ๋ฐ์ ์ธ ๋ค์ต์คํธ๋ผ ๋ฌธ์ ์ด๋ค.
๋ฌด๋ํ๊ฒ ์งํ๋๋ ๋ฌธ์ ๋ผ ์ฃผ์์ผ๋ก ๋์ฒดํ๊ฒ ๋ค.
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
#define MAX 1001
#define INF 99999999
struct info {
int idx; int w;
};
// NOTE : ๋น์ฉ์ด ์์ ๊ฒ๋ถํฐ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฐ์ ์์ ํ์ ์ฌ์ฉ๋๋ comparator
struct cmp {
bool operator()(const info& a, const info& b) {
return a.w > b.w;
}
};
int N,M;
vector<info> map[MAX];
int dist[MAX];
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int u,v,w; int start, dest;
cin >> N >> M;
for (int i=0; i<M; ++i) {
cin >> u >> v >> w;
map[u].push_back({v, w});
}
cin >> start >> dest;
// NOTE : ๊ฐ ๋์์ ๋๋ฌํ๋ ๋น์ฉ์ INF๋ก ์ด๊ธฐํ
for (int i=1; i<=N; ++i) dist[i] = INF;
priority_queue<info, vector<info>, cmp> pq;
pq.push({start, 0});
// NOTE : ์์ ๋์์ ๋น์ฉ์ 0์ผ๋ก ์ด๊ธฐํ
dist[start] = 0;
while (!pq.empty()) {
auto p = pq.top(); pq.pop();
int cur = p.idx, w = p.w;
// NOTE : ํด๋น ๋์์ ๋๋ฌํ๋ ๋น์ฉ์ด w๋ณด๋ค ์ด๋ฏธ ๋ ์๋ค๋ฉด ์คํตํ๋ค
if (dist[cur] < w) continue;
for (int i=0; i<map[cur].size(); ++i) {
int next = map[cur][i].idx, nw = map[cur][i].w;
// NOTE : ๋ค์ต์ค๋ฅด๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ์ ๊ฐฑ์
if (dist[next] > nw+w) {
dist[next] = nw+w;
// NOTE : ์ฐ์ ์์ ํ ๋๋ถ์ ํญ์ dist๊ฐ ์์ ๊ฒ๋ถํฐ ์ฒ๋ฆฌ๋๋ค
pq.push({next, dist[next]});
}
}
}
cout << dist[dest];
return 0;
}
1753. ์ต๋จ๊ฒฝ๋ก
๋ฌธ์ ์์ฝ
๋ฐฉํฅ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ก์ ๋,
์ฃผ์ด์ง ์์์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ์ผ๋ก์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด๋ณด์.
์์์ ๋ ฅ
5 6 => ์ ์ ์ ์ V, ๊ฐ์ ์ ์ E
1 => ์์์ K
5 1 1 => u, v, w : u์์ v๋ก ๊ฐ๋ ๊ฐ์ค์น w
1 2 2
1 3 3
2 3 4
2 4 5
3 4 6
ํด์ค & ์ ์ฒด ์ฝ๋
1916. ์ต์๋น์ฉ ๊ตฌํ๊ธฐ ์ ๊ฑฐ์ ๋์ผํ ๋ฌธ์ ์ด๋ค.
๋ค๋ง ์ด๋ฒ์๋ ์์์ ๊ณผ ๋์ฐฉ์ ์ด ์ ํด์ง์ง ์๊ณ
์์์ ์์ ๋ชจ๋ ์ ์ ์ผ๋ก์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
๋ฌด๋ํ๊ฒ ์งํ๋๋ ๋ฌธ์ ๋ผ ์ฃผ์์ผ๋ก ๋์ฒดํ๊ฒ ๋ค.
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
#define MAX 20001
#define INF 9999999
int V, E, K;
struct info {
int idx; int w;
};
// NOTE : ๋น์ฉ์ด ์์ ๊ฒ๋ถํฐ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฐ์ ์์ ํ์ ์ฌ์ฉ๋๋ comparator
struct cmp {
bool operator()(const info& a, const info& b) {
return a.w > b.w;
}
};
vector<info> map[MAX];
int dist[MAX];
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> V >> E >> K;
int u,v,w;
for (int i=0; i<E; ++i) {
cin >> u >> v >> w;
map[u].push_back({v, w});
}
// NOTE : ๊ฐ ๋์์ ๋๋ฌํ๋ ๋น์ฉ์ INF๋ก ์ด๊ธฐํ
for (int i=1; i<=V; ++i) dist[i] = INF;
priority_queue<info, vector<info>, cmp> min_pq;
min_pq.push({K, 0});
// NOTE : ์์ ๋์ K์ ๋น์ฉ์ 0์ผ๋ก ์ด๊ธฐํ
dist[K] = 0;
while (!min_pq.empty()) {
auto p = min_pq.top(); min_pq.pop();
int cur = p.idx, w = p.w;
// NOTE : ํด๋น ๋์์ ๋๋ฌํ๋ ๋น์ฉ์ด w๋ณด๋ค ์ด๋ฏธ ๋ ์๋ค๋ฉด ์คํตํ๋ค
if (dist[cur] < w) continue;
for (int i=0; i<map[cur].size(); ++i) {
int next = map[cur][i].idx, nw = map[cur][i].w;
// NOTE : ๋ค์ต์ค๋ฅด๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ์ ๊ฐฑ์
if (dist[next] > w + nw) {
dist[next] = w + nw;
// NOTE : ์ฐ์ ์์ ํ ๋๋ถ์ ํญ์ dist๊ฐ ์์ ๊ฒ๋ถํฐ ์ฒ๋ฆฌ๋๋ค
min_pq.push({next, dist[next]});
}
}
}
// NOTE : ๊ฐ dist๋ฅผ ์กฐ์ฌํด์ INF์ธ์ง ์๋์ง๋ง ํ๋จํ๋ฉด ๋๋ค
for (int i=1; i<=V; ++i) {
if (dist[i] == INF) cout << "INF\n";
else cout << dist[i] << '\n';
}
return 0;
}
Review
1238. ํํฐ
18352. ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ
1446. ์ง๋ฆ๊ธธ
10282. ํดํน
5972. ํ๋ฐฐ ๋ฐฐ์ก
1445. ์ผ์์ผ ์์นจ์ ๋ฐ์ดํธ
6์ฃผ์ฐจ : Implementation
๋ชฉ์ฐจ
- ME
- ํ์
5430. AC
๋ฌธ์ ์์ฝ
๋ฌธ์ ์ ๋ชฉํ๋ ์ด๋ค ์ ์๋ฐฐ์ด์ด ์ฃผ์ด์ก์ ๋
์ฃผ์ด์ง ๋ช
๋ น์ด์ ๋ฐ๋ผ์ ๋ฐฐ์ด์ ๋ณํํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ด๋ค.
ํจ์ P์ ์ข ๋ฅ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์๋ค.
- R : ๋ฐฐ์ด์ ์๋ ์์ ์์๋ฅผ ๋ค์ง๋ ํจ์
- D : ์ฒซ ๋ฒ์งธ ์ซ์๋ฅผ ๋ฒ๋ฆฌ๋ ํจ์
- ๋ฐฐ์ด์ด ๋น์ด์๋๋ฐ D๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
์๋ฅผ ๋ค์ด, RDD๋ ๋ฐฐ์ด์ ๋ค์ง๊ณ ๋ค๋ถํฐ ์ซ์๋ฅผ 2๋ฒ ๋ฒ๋ฆฌ๋ฉด ๋๋ ๊ฒ์ด๋ค.
์์ ์ ๋ ฅ
4 => ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์ T
RDD => T1์ ํจ์ P
4 => T1์ ๋ฐฐ์ด์ ๋ค์ด์๋ ์์ ๊ฐ์ n
[1,2,3,4] => T1์ ๋ฐฐ์ด์ ๋ค์ด์๋ ์
DD => T2์ ํจ์ P
1 => T2์ ๋ฐฐ์ด์ ๋ค์ด์๋ ์์ ๊ฐ์ n
[42] => T2์ ๋ฐฐ์ด์ ๋ค์ด์๋ ์
RRD => T3์ ํจ์ P
...
์ฒซ์งธ ์ค์ ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค.
๊ฐ ํ
์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์๋ ์ํํ ํจ์ P๊ฐ ์ฃผ์ด์ง๋ค.
๋ค์ ์ค์๋ ๋ฐฐ์ด์ ๋ค์ด์๋ ์์ ๊ฐ์ n์ด ์ฃผ์ด์ง๊ณ ,
๊ทธ ๋ค์ ์ค์๋ [x1,...,xn] ํํ๋ก ๋ฐฐ์ด์ ๋ค์ด์๋ ์๊ฐ ์ฃผ์ด์ง๋ค.
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด, ์ ์๋ฐฐ์ด์ ํจ์ P๋ฅผ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด๋ณด์.
ํด์ค & ์ ์ฒด ์ฝ๋
๊ทธ๋ฅ ๋ฐ๊ณ ๋๊ฐ๋ฉด ๋๋ ๋ฌธ์ ๋ผ ์ฃผ์์ผ๋ก ๋์ฒดํ๊ฒ ๋ค.
ํต์ฌ ์์ด๋์ด๋ deque ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
#include <iostream>
#include <string>
#include <deque>
using namespace std;
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int T; cin >> T;
while (T--) {
string p, num; int n;
cin >> p; cin >> n; cin >> num;
string t = "";
deque<int> dq;
for (int i=0; i<num.length(); ++i) {
/**
* ์ซ์๋ง ๋ฝ์๋ด์ t์ ๋ด๋๋ค
*/
if (num[i] == '[' || num[i] == ']') continue;
if (num[i] == ',') {
dq.push_back(stoi(t));
t.clear();
}
else t += num[i];
}
/**
* i๊ฐ length๋ณด๋ค ์ปค์ ธ์ ํ์ถํ ๊ฑฐ๋ผ, ๋ง์ง๋ง ์ซ์๋ฅผ ๋ฃ์ด์ฃผ๋ ์์
์ ํด์ค์ผํ๋ค
*/
if (!t.empty()) dq.push_back(stoi(t));
/**
* - R์ ๋ง๋๋ฉด ๋ค์ง์ด์ฃผ๊ณ , D๋ฅผ ๋ง๋๋ฉด ์์์๋ถํฐ ๋นผ์ค๋ค
*
* - ๋ค์ง๋ ๊ฒ์ is_front๋ฅผ ํตํด ๊ตฌ๋ถํ๊ณ ,
* D๋ฅผ ๋ง๋๋ฉด is_front์ ๋ฐ๋ผ์ pop_front, pop_back์ ํด์ค๋ค
*
* - deque๊ฐ ๋น์ด์๋๋ฐ D๋ฅผ ๋ง๋๋ฉด ์๋ฌ๋ฅผ ์ถ๋ ฅํด์ผํ๊ณ ,
* ์ด๋ฅผ ์ํด err ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ค
*/
bool is_front = true;
bool err = false;
for (int i=0; i<p.length(); ++i) {
if (p[i] == 'R') {
is_front = !is_front;
}
else {
if (dq.empty()) {
err = true;
break;
}
if (is_front) dq.pop_front();
else dq.pop_back();
}
}
/**
* - ์๋ฌ๊ฐ ๋ฐ์ํ์ผ๋ฉด error ์ถ๋ ฅ
*
* - ์๋๋ผ๋ฉด, is_front์ ๋ฐ๋ผ์ ์ ์ ํ
* pop_front, pop_back์ ํด์ฃผ๋ฉด ๋๋ค
*/
if (err) {
cout << "error" << '\n';
}
else {
string ans = "[";
if (is_front) {
while (!dq.empty()) {
int x = dq.front();
ans += to_string(x) + ",";
dq.pop_front();
}
}
else {
while (!dq.empty()) {
int x = dq.back();
ans += to_string(x) + ",";
dq.pop_back();
}
}
/**
* ์
๋ ฅ ์์ฒด๊ฐ [] <- ๋น๋ฐฐ์ด๋ก ๋ค์ด์ค๋ฉด
* ํ์ฌ ans๋ "[" ์ธ ์ํ๋ผ์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค
*/
if (ans[ans.length()-1] == ',') ans[ans.length()-1] = ']';
else ans += ']';
cout << ans << '\n';
}
}
return 0;
}
4673. ์ ํ ๋๋ฒ
๋ฌธ์ ์์ฝ
๋ค์๊ณผ ๊ฐ์ ํจ์๋ฅผ ์ ์ํ์.
d(n) := n๊ณผ n์ ๊ฐ ์๋ฆฌ์๋ฅผ ๋ํ๋ ํจ์
์์: d(75) = 75 + 7 + 5 = 87
์ด๋, n์ d(n)์ ์์ฑ์ ๋ผ๊ณ ํ๋ค.
์ด ๋ฌธ์ ๋ ์์ฑ์๊ฐ ์๋ ์ซ์๋ฅผ ์ฐพ๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
100๋ณด๋ค ์์ ์
ํ ๋๋ฒ์๋
1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97์ด ์๋ค.
10,000 ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ํ ๋๋ฒ๋ฅผ ๋ชจ๋ ์ฐพ์ ์ถ๋ ฅํด๋ณด์.
ํด์ค & ์ ์ฒด ์ฝ๋
์ด ๋ฌธ์ ์ญ์ ๊ทธ๋ฅ ๋ฐ๊ณ ๋๊ฐ๋ฉด ๋๋ ๋ฌธ์ ๋ผ ์ฃผ์์ผ๋ก ๋์ฒดํ๊ฒ ๋ค.
์์ด๋์ด๋ 1 ~ 10,000๊น์ง ๋ฏธ๋ฆฌ ์ํ๋ฅผ ํด์
๋ฏธ๋ฆฌ ์์ฑ์๊ฐ ์๋ ์ซ์๋ค์ ์ฒดํฌํด๋๋๊ฒ ์ ๋ถ์ด๋ค.
#include <iostream>
using namespace std;
bool filter[10001];
int dn(int n) {
int sum = 0; int temp = n;
while (temp) {
sum += temp%10;
temp /= 10;
}
return sum + n;
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
for (int i=1; i<=10000; ++i) {
/**
* ์์ฑ์๊ฐ ์๋ ์ซ์๋ค์ ์ฒดํฌํด๋๋๋ค
* ๊ฐ๋จํ๊ฒ dn(i) ์ธ๋ฑ์ค๋ฅผ true๋ก ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค
*/
if (dn(i) > 10000) continue;
filter[dn(i)] = true;
}
/**
* filter๊ฐ false์ธ ์ซ์๋ค์ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค
* ๊ทธ๊ฒ ๊ณง ์
ํ๋๋ฒ์ด๋ค
*/
for (int i=1; i<=10000; ++i) {
if (filter[i]) continue;
cout << i << '\n';
}
return 0;
}
Review
3019. ํ ํธ๋ฆฌ์ค
16236. ์๊ธฐ ์์ด
17413. ๋จ์ด ๋ค์ง๊ธฐ 2
15683. ๊ฐ์
1966. ํ๋ฆฐํฐ ํ
2239. ์ค๋์ฟ
5์ฃผ์ฐจ : DP
๋ชฉ์ฐจ
- ME
- ํ์
2098. ์ธํ์ ์ํ
๋ฌธ์ ์์ฝ
1๋ฒ๋ถํฐ N๋ฒ๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ ๋์๋ค์ด ์๋ค.
์ด๋, ํ ๋์์์ ์ถ๋ฐํด N๊ฐ์ ๋์๋ฅผ ๊ฑฐ์ณ ๋ค์ ์๋ ๋์๋ก ๋์์ค๋ ๊ฒ์ด ๋ชฉํ.
- ํ ๋ฒ ๊ฐ๋ ๋์๋ก๋ ๋ค์ ๊ฐ ์ ์๋ค. (๋งจ ๋ง์ง๋ง์ ์ฌํ์ ์ถ๋ฐํ๋ ๋์๋ก ๋์์ค๋ ๊ฒ์ ์์ธ)
์ฌ๋ฌ ๊ฐ์ง ๊ฒฝ๋ก๋ค ์ค์์ ๊ฐ์ฅ ์ ์ ๋น์ฉ์ ๋ค์ด๋ ๊ฒฝ๋ก๋ฅผ ์ฐพ์๋ณด์.
์ ๋ ฅ์ผ๋ก W[i][j] ๊ฐ ์ฃผ์ด์ง๋ค.
W[i][j] : i๋ฒ ๋์์์ j๋ฒ ๋์๋ก ๊ฐ๋ ๋น์ฉ
ํญ์ ์ํํ ์ ์๋ ๊ฒฝ์ฐ๋ง ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
(์์์ ๋ ฅ)
4 => ๋์์ ์ N
0 10 15 20 => W[0][0] ~ W[0][3]
5 0 9 10
6 13 0 12
8 8 9 0
ํด์ค
- DFS
- DP
- Bitmask
์ ์์ด๋์ด๋ค๋ก ํด๊ฒฐ์ ํ ์ ์๋ ๋ฌธ์ ์๋ค.
dp๋ฅผ ์ํด 2์ฐจ์ ๋ฐฐ์ด์ ์ด์ฉํ ๊ฑด๋ฐ ์ ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
dp[a][b] : b๋ผ๋ ์ํ๋ก a๋ฅผ ๋ฐฉ๋ฌธํ ์ํฉ์ผ๋ ๋น์ฉ์ ์ต์๊ฐ
b๋ผ๋ ์ํ ๋ ๋ฐฉ๋ฌธํ ๋์๋ค์ ๋ํ๋ด๋ฉฐ
์ด๋ฅผ ์ํด Bitmask๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค.
1. ์ ๋ ฅ๋ฐ๊ธฐ
#define MAX 16
int N;
int w[MAX][MAX];
...
cin >> N;
for (int i=0; i<N; ++i) {
for (int j=0; j<N; ++j) {
cin >> w[i][j];
}
}
2. DFS ์ง์ ์ main
// int dfs(int cur, int visited);
cout << dfs(0, 1 << 0);
dfs๋ฅผ ์ด๋์ ์์ํ๋ ๊ฒฐ๊ตญ์๋ ๋ชจ๋ ๋์๋ฅผ ์ํํ๋ฉฐ ์ต์๊ฐ์ ์ฐพ๋๊ฒ ๋ชฉํ์ด๋ค.
๊ทธ๋์ ์์์ ์ ์ด๋๋ก ์ก๋ ๊ฒฐ๊ณผ๋ ๋์ผํจ์ด ๋ณด์ฅ๋๊ณ
ํธ์์ 0๋ฒ ๋์์์ ์์ํ๋๋ก ํ์๋ค.
Bitmask๋ฅผ ํตํด ๋ฐฉ๋ฌธ์ํ๋ฅผ ๋ํ๋ผ ๊ฒ์ด๊ธฐ ๋๋ฌธ์,
0๋ฒ ๋์๋ฅผ ๋ฐฉ๋ฌธํ๋ค๋ ์๋ฏธ๋ก
1์ 0์นธ left shiftํ ๊ฐ์ 2๋ฒ์งธ ์ธ์๋ก ๋๊ฒจ์ฃผ์๋ค.
3. DFS
#define UPPER_BOUND 9999999
int dp[MAX][1 << MAX];
...
bool is_visited(int visited, int city) {
return visited & (1 << city);
}
int make_visited(int visited, int city) {
return visited | (1 << city);
}
int dfs(int cur, int visited) {
if (visited == (1 << N) - 1) {
if (w[cur][0] == 0) return UPPER_BOUND;
return w[cur][0];
}
if (dp[cur][visited] != 0) return dp[cur][visited];
dp[cur][visited] = UPPER_BOUND;
for (int next=0; next<N; ++next) {
if (is_visited(visited, next) || w[cur][next] == 0) continue;
dp[cur][visited] = min(
dp[cur][visited],
w[cur][next] + dfs(next, make_visited(visited, next)
));
}
return dp[cur][visited];
}
3-a) Bitmask ๊ด๋ จ ํจ์
bool is_visited(int visited, int city) {
return visited & (1 << city);
}
int make_visited(int visited, int city) {
return visited | (1 << city);
}
๋นํธ๋ง์คํน์ ์ฌ์ฉํด
- ํด๋น ๋์๊ฐ ๋ฐฉ๋ฌธํ๋์ง (&)
- ํ์ฌ ๋ฐฉ๋ฌธ์ํ๋ฅผ ์ ๋ฐ์ดํธ (|)
ํ๊ฒ๋ ํ๋ ํจ์๋ค์ด๋ค.
3-b) DFS
#define UPPER_BOUND 9999999
int dp[MAX][1 << MAX];
ํด์ค์ ๋ค์ด๊ฐ๊ธฐ์ ์์์ dp์ ๋ํ ์ ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ค.
dp[a][b] : b๋ผ๋ ์ํ๋ก a๋ฅผ ๋ฐฉ๋ฌธํ ์ํฉ์ผ๋ ๋น์ฉ์ ์ต์๊ฐ
๋ฌธ์ ์กฐ๊ฑด์์ ๋์ N์ 16๊ฐ ์ดํ์ธ ์ํฉ์ด๋ค.
๋ฐ๋ผ์ ๋ชจ๋ ๋์์ ๋ฐฉ๋ฌธ์ํ๋ฅผ ๋ํ๋ด๊ธฐ ์ํด์๋ 16๊ฐ์ ๋นํธ๊ฐ ํ์ํ๋ค.
1 << 16 - 1
1000 0000 0000 0000 0
- 1
-----------------------
1111 1111 1111 1111
๋ฐฐ์ด์ ๋ฑ 1์ ๋บ๋งํผ๋ง ํํํ ์ ์์ผ๋ฏ๋ก
๋ชฉํ์ธ ๋์์ ์ธ๋ฑ์ค 0 ~ 15๋ฅผ ๋ชจ๋ ํํ๊ฐ๋ฅํ๊ฒ ๋๋ค.
์ด๊ฒ์ด dp์ 2๋ฒ์งธ ์ฐจ์ ํฌ๊ธฐ์ ๋ํด 1์ MAX๋งํผ left shiftํ ์ด์ ์ด๋ค.
UPPER_BOUND ๋ ๋ฌธ์ ๋ฅผ ํต๊ณผ์ํค๋ ์ ์์ ์ถฉ๋ถํ ํฐ ๊ฐ์ผ๋ก ์ก์๋ค.
dp๋ฅผ ๊ฐฑ์ ํ ๋ min์ ์ฌ์ฉํด์ผํ๋ ์ด์๋ํ placeholder ์ญํ ๋ก ์ฌ์ฉ๋๋ค.
3-c) DFS
int dfs(int cur, int visited) {
// 1. ๋ชจ๋ ๋์๋ฅผ ๋ฐฉ๋ฌธํ๋ค๋ฉด
if (visited == (1 << N) - 1) {
if (w[cur][0] == 0) return UPPER_BOUND;
return w[cur][0];
}
// 2. ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ํ๋ผ๋ฉด
if (dp[cur][visited] != 0) return dp[cur][visited];
// 3. ์ต์๊ฐ์ ์ฐพ๊ธฐ ์ํ ์ด๊ธฐํ
dp[cur][visited] = UPPER_BOUND;
for (int next=0; next<N; ++next) {
// 4. ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋์๋ ๋ฐฉ๋ฌธํ ์ ์๊ณ , ๊ฐ ์ ์๋ ๋์๋ ๋ฐฉ๋ฌธํ ์ ์๋ค
if (is_visited(visited, next) || w[cur][next] == 0) continue;
// 5. ์ต์๊ฐ ๊ฐฑ์
dp[cur][visited] = min(
dp[cur][visited],
w[cur][next] + dfs(next, make_visited(visited, next)
));
}
return dp[cur][visited];
}
- ๋ชจ๋ ๋์๋ฅผ ๋ฐฉ๋ฌธํ๋ค๋ฉด w[cur][0] ์ ๋ฆฌํด
- ๋จ, ํ์ฌ cur์์ 0์ ๊ฐ ์ ์์ด์ผํจ
- dp๊ฐ ์กด์ฌํ๋ฉด ๋ฆฌํด
- dp ๊ฐฑ์
- dp[cur][visited] vs w[cur][next] + dfs(next, make_visited(visited, next))
์ ์ฒด ์ฝ๋
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 16
#define UPPER_BOUND 9999999
int w[MAX][MAX];
int dp[MAX][1 << MAX];
int N;
bool is_visited(int visited, int city) {
return visited & (1 << city);
}
int make_visited(int visited, int city) {
return visited | (1 << city);
}
int dfs(int cur, int visited) {
if (visited == (1 << N) - 1) {
if (w[cur][0] == 0) return UPPER_BOUND;
return w[cur][0];
}
if (dp[cur][visited] != 0) return dp[cur][visited];
dp[cur][visited] = UPPER_BOUND;
for (int next=0; next<N; ++next) {
if (is_visited(visited, next) || w[cur][next] == 0) continue;
dp[cur][visited] = min(dp[cur][visited], w[cur][next] + dfs(next, make_visited(visited, next)));
}
return dp[cur][visited];
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N;
for (int i=0; i<N; ++i) {
for (int j=0; j<N; ++j) {
cin >> w[i][j];
}
}
cout << dfs(0, 1 << 0);
return 0;
}
1149. RGB๊ฑฐ๋ฆฌ
๋ฌธ์ ์์ฝ
1๋ฒ ์ง๋ถํฐ N๋ฒ ์ง๊น์ง N๊ฐ์ ์ง์ด ์ฃผ์ด์ง๋ค.
์ง์ R, G, B ์ค ํ๋์ ์์ผ๋ก ์น ํด์ผ ํ๋ค. ์๋ก ์ด์ํ๋ ์ง์ ๊ฐ์ ์์ผ๋ก ์น ํ ์ ์๋ค.
๊ฐ ์ง์ ์น ํ๋ ๋น์ฉ์ด R, G, B ๋ณ๋ก ์ฃผ์ด์ก์ ๋ ๋ชจ๋ ์ง์ ์น ํ๋ ๋น์ฉ์ ์ต์๊ฐ์ ๊ตฌํด๋ณด์.
(์์์ ๋ ฅ)
3 => ์ง์ ์ N
26 40 83 => 1๋ฒ ์ง์ R, G, B ์์น ๋น์ฉ
49 60 57
13 89 99
ํด์ค
0. ์์ด๋์ด
dp๋ฅผ 2์ฐจ์ ๋ฐฐ์ด๋ก ํํํด ๋ณผ ์ ์๋ค.
dp[a][b] : b๋ผ๋ ์์ผ๋ก a๋ฒ์งธ ์ง์ ์น ํ๋ ๋น์ฉ์ ์ต์๊ฐ
์ฆ, ์ ์ฒด ์ง์ ์น ํ๋ค๋ ๊ฒ์ ํฌ์ปค์ค๋ฅผ ๋์ง๋ง๊ณ
๋ชฉํ ์์ฒด๋ฅผ ์๊ฒํด์ ์๊ฐํ๋ ๊ฒ์ด ํต์ฌ.
1. ์ ๋ ฅ๋ฐ๊ธฐ & dp ์ด๊ธฐํ & dp
#define MAX 1001
int N;
int dp[MAX][3];
#define MAX 1001
typedef enum {
RED,
GREEN,
BLUE
} Color;
...
cin >> N;
int r,g,b;
dp[0][0] = dp[0][1] = dp[0][2] = 0;
for (int i=1; i<=N; ++i) {
cin >> r >> g >> b;
dp[i][RED] = min(dp[i-1][GREEN], dp[i-1][BLUE]) + r;
dp[i][GREEN] = min(dp[i-1][RED], dp[i-1][BLUE]) + g;
dp[i][BLUE] = min(dp[i-1][RED], dp[i-1][GREEN]) + b;
}
cout << min(dp[N][RED], min(dp[N][GREEN], dp[N][BLUE]));
๊ฐ๋จํ๋ค.
๊ฐ dp๋ง๋ค 3๊ฐ์ง์ ์๊น ๋ณ๋ก ๋น์ฉ์ ๊ฐฑ์ ํด์ฃผ๋ฉด ๋๋ค.
ํ์ฌ ์น ํ๋ ์๊น๊ณผ ์ด์ ์ ์น ํ ์๊น์ ๊ฐ์ ์ ์๋ค๋ ๊ฒ๋ง ์ ์ํ๋ฉด ๋๋ค.
์ ์ฒด ์ฝ๋
#include <iostream>
using namespace std;
#define MAX 1001
int N;
int dp[MAX][3];
#define MAX 1001
typedef enum {
RED,
GREEN,
BLUE
} Color;
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N;
int r,g,b;
dp[0][0] = dp[0][1] = dp[0][2] = 0;
for (int i=1; i<=N; ++i) {
cin >> r >> g >> b;
dp[i][RED] = min(dp[i-1][GREEN], dp[i-1][BLUE]) + r;
dp[i][GREEN] = min(dp[i-1][RED], dp[i-1][BLUE]) + g;
dp[i][BLUE] = min(dp[i-1][RED], dp[i-1][GREEN]) + b;
}
cout << min(dp[N][RED], min(dp[N][GREEN], dp[N][BLUE]));
return 0;
}
Review
9251. LCS
๋ ๋ฌธ์๊ฐ ๊ฐ์ง ์์์ง์ ๋ฐ๋ผ์ ๋ฌ๋ผ์ง๋๊ฒ ํต์ฌ.
๊ฐ์์๋๋ ์ด์ dp๋ฅผ ๊ทธ๋๋ก ์ด์ฉ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฌธ์ ๋ ์ญ์ dp๋ฅผ 2์ฐจ์ ๋ฐฐ์ด๋ก ๊ด๋ฆฌํ๊ณ ,
๊ฐ string ์ ์ฒด๋ฅผ ๋ณด์ง์๊ณ ์์ ๋ถ๋ถ๋ฌธ์์ด๋ถํฐ ์์ํ๋ฉด ๋๋ค.
๊ฐฑ์ ๊ณผ์ ์์ ์ด์ dp๋ฅผ ์๊ตฌํ๊ธฐ ๋๋ฌธ์ ์ด๊ธฐํ ์์ ๋ ํด์ค์ผํ๋ค.
1912. ์ฐ์ํฉ
์ผ๋จ ์ด ๋ฌธ์ ์์ฒด๊ฐ ๊ทผ๋ณธ์ ์ผ๋ก ์ด๋ค ์ฐ์๋ ๊ฒ์ ์ก์์ผํ ์ง ํท๊ฐ๋ฆฌ๊ฒ ํ๋ค.
- ์ด๋์๋ถํฐ ์์ํด์ผํ์ง?
- ์ด๋ค ์ง์ ์์ ๋์ด์ผํ์ง?
๊ฒฐ๊ตญ ํด๊ฒฐ์ฑ
์ i๋ฒ์งธ ์๊น์ง ์์๋ ์ด๋ค ํ๋จ์ ํ ๊ฒ์ธ๊ฐ? ์ด๋ค.
๋ํ ์ผ๋จ ์ฒซ๋ฒ์งธ ์๋ถํฐ ์ ํํ๊ณ ์์ํ๋ค๋ ๊ฒ์ด๋ค.
์ฐ์ํ๋ ์์ด์ด ๊ผญ ์ฒซ๋ฒ์งธ ์๋ถํฐ ์์ํ ํ์๋ ์๋๋ฐ?
๋ง๋ค. ๊ทผ๋ฐ ๊ฒฐ๊ตญ dp๋ฅผ ๊ฐฑ์ ํ๋ ํ๋จ์์ ๊ฑธ๋ฌ์ง๊ฒ ๋๋ค.
int ans = dp[1];
for (int i=2; i<=n; ++i) {
dp[i] = max(num[i], dp[i-1]+num[i]);
ans = max(ans, dp[i]);
}
์ฆ, i๋ฒ์งธ ์๊น์ง ์์๋ ํ์ฌ ์๋ฅผ ์ ํํ๋๋ง๋๋ก ๊ฒฐ์ ์ ๋ด๋ฆฐ๋ค๋ ๊ฒ.
๋ง์ฝ ํ์ฌ๋ฅผ ์ ํํ๋ฉด ์๋ก์ด ๋ฌธ์์ด์ ์์ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ด ๋ฌธ์ ์ ํน์ดํ์ ์
dp์ ๋ด๊ธฐ๋ ๊ฐ์ด ์ง์ ์ผ๋ก ๋์ง์ ์ด์ง ์๋ค๋ ๊ฒ์ด๋ค.
14501. ํด์ฌ
์ด ๋ฌธ์ ๋ ๋ง๊ฐ๊ธฐํ์ด๋ผ๋ ์์ฑ์ ๊ธฐ๋ฐํด์
dp๋ฅผ ๊ฑฐ๊พธ๋ก ๊ฐฑ์ ํ๋ ๋ฌธ์ ์ด๋ค.
for (int i=N-1; i>=1; --i) {
if (info[i].t + i > N+1) {
dp[i] = dp[i+1];
}
else dp[i] = max(dp[i+1], info[i].p + dp[info[i].t + i]);
}
๋ง๊ฐ๊ธฐํ์ด ๋์ด๊ฐ๋ฉด ๊ทธ ์ผ์ ํ ์ ์๊ณ , ์ด๋ฅผ ๋ค์ dp๋ก๋ถํฐ ๋ก๊ฒจ์ค๋ ๊ฑธ๋ก ํํ.
๊ฐ๋ฅํ๋ค๋ฉด ๋น์ฐํ ๋ค์๋ dp์ ํ์ฌ ์ผ์ ํ์๋ dp ์ค ํฐ๊ฐ์ ์ ํํ๊ฒ ๋๋ค.
1520. ๋ด๋ฆฌ๋ง ๊ธธ
์ด ๋ฌธ์ ๋ ๋ชฉํ์ง์ ์ ๋๋ฌํ์๋ return 1์ ํด์ฃผ๋ ๊ฒ๊ณผ
dp๋ฅผ ์ด๊ธฐํํ๋ ์์ ์ ๋ฐฉ๋ฌธ ์ํ๋ค๋ ๊ฒ์ ๋ฐ์๋๊ณ ๊ฐ๋๊ฒ ํต์ฌ์ด๋ค.
๋ฐฉ๋ฌธ ์ํ ๊ฑธ 0์ผ๋ก ํ๋ฉด ์๋๋ค.
ํด๋น ๋ฐฉํฅ์ผ๋ก๋ ๋ชฉํ์ง์ ์ ๋๋ฌํ ์ ์๋ค๋ ์๋ฏธ๋ฅผ ๋ํ๋ด๊ธฐ ๋๋ฌธ.
dfs + dp ๋ฌธ์ ์์ ๋ ๊ทธ๋ ๋ฏ
๊ฒฐ๊ตญ dp๋ฅผ ๋ฆฌํดํด์ฃผ๋ฉด ๋๋ ๋ฌธ์ ์๋ค.
25215. ํ์ดํ
๊ทธ๋ฅ ๋ค์ ๋ฌธ์์ ๋ํด ์กฐ์ฌํ๋ฉด์ ์ต์ ์ ํ๋์ ํ๋ ๋ฌธ์ .
์๋ฅผ ๋ค์ด, ํ์ฌ๊ฐ ์๋ฌธ์๊ณ ๋ค์๋ฌธ์๋ ์๋ฌธ์๋ผ๋ฉด
์บก์ค๋ฝ์ด ๋๋ฌ์ ธ์๋ ์ํฉ์์ ์บก์ค๋ฝ์ ๊บผ์ฃผ๋ ๊ฒ์ด ์ต์ ์ด๋ค.
2533. ์ฌํ๋ง ์๋น์ค
- dfs๋ฅผ ์์ํ ๋ ํ๊ฐ์ ๋ ธ๋๋ง์ผ๋ก๋ ์ถฉ๋ถํ๋ค (๋ชจ๋ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋์ด ์๋ค๋ ์ ํ ์กฐ๊ฑด)
- ํด๋น ์์๋
ธ๋๊ฐ EARLY_ADAPTER์ด๊ฑฐ๋ GENERAL์ผ ์ ์๋ค
- ์ฌ๊ธฐ์ dp๋ฅผ 2์ฐจ์์ผ๋ก ๊ด๋ฆฌ
- ๋ต์ ์ถ๋ ฅํ๋ ํํ๊ฐ min(dp[1][EARLY_ADAPTER], dp[1][GENERAL])
- dfs ์ฑ์ง ๋๋ฌธ์ ์ต์๋จ dp[1][EARLY_ADAPTER|GENERAL]์ด ์ต์ข ์ ์ผ๋ก ๊ฐฑ์ ๋จ
- void ๋ฆฌํดํ์ ์ dfs
- ํ์ฌ ๋
ธ๋๋ฅผ GENERAL๋ก ๋ถ์ฌ ํ๋ ๊ฒฝ์ฐ์ EARLY_ADAPTER๋ก ๋ถ์ฌํ๋ ๊ฒฝ์ฐ
- GENERAL : ๋ค์ dp[next][EARLY_ADAPTER]๋ฅผ ๋ํด์ค์ผํ๋ง cur๋ EARLY_ADAPTER๊ฐ ๋จ
- EARLY_ADAPTER : min(dp[next][EARLY_ADAPTER], dp[next][GENERAL])
4์ฃผ์ฐจ : Greedy
๋ชฉ์ฐจ
- ME
- ํ์
1026. ๋ณด๋ฌผ
๋ฌธ์ ์์ฝ
์
๋ ฅ์ผ๋ก ๊ธธ์ด N์ ๋ ๋ฐฐ์ด A, B๊ฐ ์ฃผ์ด์ง๋ค.
์ด๋ ํจ์ S๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋๋ค.
S = A[0] ร B[0] + ... + A[N-1] ร B[N-1]
S์ ๊ฐ์ ๊ฐ์ฅ ์๊ฒ ๋ง๋ค๊ธฐ ์ํด A์ ์๋ฅผ ์ฌ๋ฐฐ์ดํ์.
S์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๊ฒ์ด ๋ชฉํ.
ํด์ค
๋๋ฌด ๊ฐ๋จํ๋ค.
A๋ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ, B๋ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ์ ํด์
๊ฐ๊ฐ์ ๊ณฑํด์ฃผ๋ฉด ๋๋ค.
์ต์๊ฐ์ ๋ง๋ค์ด ๋ด๋ ค๋ฉด
ํฐ์ * ํฐ์ ๋ณด๋ค๋ ํฐ์ * ์์์๋ฅผ ๊ณฑํด์ผํ๊ณ
์ด๋ ๊ฒ ์ฐ์ฐํ์ ๋ ์ต์๊ฐ์ด greedyํ๊ฒ ๋์ค๊ฒ ๋๋ค.
์ ์ฒด ์ฝ๋
#include <iostream>
#include <algorithm>
using namespace std;
#define MAX 50
int N;
int A[MAX], B[MAX];
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N;
for (int i=0; i<N; ++i) cin >> A[i];
for (int i=0; i<N; ++i) cin >> B[i];
sort(A, A+N);
sort(B, B+N, greater<int>());
int ans = 0;
for (int i=0; i<N; ++i) ans += A[i]*B[i];
cout << ans;
return 0;
}
1202. ๋ณด์ ๋๋
๋ฌธ์ ์์ฝ
๋ณด์ N๊ฐ์ ๊ฐ๋ฐฉ K๊ฐ๊ฐ ์๋ค.
๊ฐ ๋ณด์์ ๋ฌด๊ฒ M, ๊ฐ๊ฒฉ V๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์
๋ ฅ์ผ๋ก ๋จผ์ N, K๊ฐ ์ฃผ์ด์ง๋ค.
๊ทธ ๋ค์ N๊ฐ์ ์ค์ ๊ฑธ์ณ์ ๊ฐ ๋ณด์์ ๋ฌด๊ฒ์ ๊ฐ๊ฒฉ์ด ์ฃผ์ด์ง๋ค.
๊ทธ ๋ค์ K๊ฐ์ ๊ฐ๋ฐฉ์ ๋ํด ์ต๋๋ก ๋ด์ ์ ์๋ ๋ฌด๊ฒ๊ฐ ์ฃผ์ด์ง๋ค.
์์) ๋ณด์์ด 3๊ฐ์ด๊ณ ๊ฐ๋ฐฉ์ด 2๊ฐ์ธ ๊ฒฝ์ฐ
3 2 => (N, K)
1 65 => (๋ฌด๊ฒ, ๊ฐ๊ฒฉ)
5 23
2 99
10 2 => (๊ฐ๋ฐฉ ์ต๋ ํ์ฉ ๋ฌด๊ฒ)
์ด๋ ๊ฒ ๋ณด์๊ณผ ๊ฐ๋ฐฉ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋
๊ฐ๋ฐฉ์ ๋ด์ ์ ์๋ ๋ณด์ ๊ฐ๊ฒฉ ํฉ์ ์ต๋๊ฐ์ ๊ตฌํด๋ณด์.
ํด์ค
0. ์์ด๋์ด
- ์ ๋ ฌ
- ๋ณด์์ ๋ฌด๊ฒ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
- ๊ฐ๋ฐฉ์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
- ๊ฐ๋ฐฉ์ ์ํ
- ํ์ฌ ๊ฐ๋ฐฉ์ด ํ์ฉํ๋ ๋ฌด๊ฒ ๋ฒ์ ์์ ์๋ ๋ณด์๋ค์ max heap์ ๋ฃ๋๋ค.
- ํ์ด ๋น์ด์์ง ์๋ค๋ฉด pop์ ํด์ ๊ฐ๊ฒฉ์ ๋ํด์ค๋ค.
์์ ๊ฐ์ ํ๋ฆ์ผ๋ก greedyํ๊ฒ ํ ์ ์๋ค.
ํ์ฌ ๊ฐ๋ฐฉ์ด ํ์ฉํ๋ ๋ฌด๊ฒ ๋ฒ์ ์์ ์๋ ๋ณด์๋ค์ ์ ๋ถ ๋ค ๋ด๊ณ
๊ฑฐ๊ธฐ์ ๊ฐ์ฅ ๊ฐ์น๊ฐ ๋์ ๋ณด์์ ์ ํํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ค์ ๊ฐ๋ฐฉ์ผ๋ก ๋์ด๊ฐ๋ณด์.
ํ์ฌ max heap์๋ ์ด์ ๊ฐ๋ฐฉ๊ธฐ์ค ํ์ฉ๋์๋ ๋ณด์๋ค์ด ๋ด๊ฒจ์๋ค.
ํ์ฌ ๊ฐ๋ฐฉ์ ๋ํด์ ๋ค์ ํ๋ฒ ๊ฐ๋ฐฉ์ด ํ์ฉํ๋ ๋ฒ์์ ๋ณด์๋ค์ ๋ด๊ฒ๋๋ค.
์ด๋ค์ ์ด์ ๊ณผ ๋๊ฐ์ max heap์ ๋ด๊ธฐ๊ฒ ๋๊ณ
์ด๋ฅผ ํตํด ํญ์ greedyํ ์ ํ์ ํ ์ ์๊ฒ ๋๋ค.
1. ๋ณด์, ๊ฐ๋ฐฉ ์ ๋ ฅ๋ฐ๊ธฐ
struct jewel {
int m, v;
};
...
int mi,vi;
vector<jewel> jwl;
for (int i=0; i<N; ++i) {
cin >> mi >> vi;
jwl.push_back({mi, vi});
}
vector<int> bag;
for (int i=0; i<K; ++i) {
int x; cin >> x; bag.push_back(x);
}
๋ณ๋ค๋ฅธ๊ฒ ์๋ค.
๋ณด์์ ์ํด์ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ์
๋ ฅ๋ฐ์๋ค.
2. ์ ๋ ฌ
sort(begin(jwl), end(jwl), [](const jewel& j1, const jewel& j2){
return j1.m < j2.m;
});
sort(begin(bag), end(bag));
๋ณด์์ ๋ฌด๊ฒ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ํด์ฃผ๊ณ ,
๊ฐ๋ฐฉ์ ์ต๋ํ์ฉ๋ฌด๊ฒ ๊ธฐ์ค ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ํด์ฃผ์๋ค.
3. ๊ฐ๋ฐฉ ์ํ
priority_queue<int, vector<int>, less<int>> max_pq;
ll ans = 0; int cnt = 0;
for (int i=0; i<K; ++i) {
while (cnt < N && jwl[cnt].m <= bag[i]) {
max_pq.push(jwl[cnt].v); ++cnt;
}
if (max_pq.empty()) continue;
ans += max_pq.top(); max_pq.pop();
}
cout << ans;
max_pq ๋ผ๋ max heap์ ๋ง๋ ๋ค.
์์ด๋์ด์์ ์ค๋ช
ํ ๊ฒ์ฒ๋ผ
ํ์ฌ ๊ฐ๋ฐฉ์ด ํ์ฉํ๋ ๋ฌด๊ฒ ๋ฒ์ ์์ ์๋ ๋ณด์๋ค์
์ค์ ๊ฐ๋ฐฉ์ ๋ณด์์ ๋ด๊ธฐ ์ , ๋ฏธ๋ฆฌ ์์
์ ํด์ฃผ๋ ๊ฒ์ด ํต์ฌ.
while (cnt < N && jwl[cnt].m <= bag[i]) {
max_pq.push(jwl[cnt].v); ++cnt;
}
์ ์ฒด ์ฝ๋
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
using ll = long long;
struct jewel {
int m; int v;
};
int N,K;
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N >> K;
int mi,vi;
vector<jewel> jwl; vector<int> bag;
for (int i=0; i<N; ++i) {
cin >> mi >> vi;
jwl.push_back({mi, vi});
}
for (int i=0; i<K; ++i) {
int x; cin >> x; bag.push_back(x);
}
sort(begin(jwl), end(jwl), [](const jewel& j1, const jewel& j2){ return j1.m < j2.m; });
sort(begin(bag), end(bag));
priority_queue<int, vector<int>, less<int>> max_pq;
ll ans = 0; int cnt = 0;
for (int i=0; i<K; ++i) {
while (cnt < N && jwl[cnt].m <= bag[i]) {
max_pq.push(jwl[cnt].v); ++cnt;
}
if (max_pq.empty()) continue;
ans += max_pq.top(); max_pq.pop();
}
cout << ans;
return 0;
}
Review
1946. ์ ์ ์ฌ์
์ด ๋ฌธ์ ์ ๊ทธ๋ฆฌ๋ํจ์ ์ ๋ ฌ์ ํตํด์ ์ป์ด์ฌ ์ ์๋ค.
๊ฒฐ๊ตญ ์ด๋ค ์ฑ์ ์ด๊ฑด 1๋ฑ์ธ ์ ๋ ๋ฌด์กฐ๊ฑด ๋ฝํ๋ค.
๋จ ํ๊ฐ๋ผ๋ ๋ค๋ฅธ ์ง์์๋ณด๋ค ๋จ์ด์ง์ง ์์ผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
int N, a, b;
vector<pii> v;
for (int i=0; i<N; ++i) {
cin >> a >> b;
v.push_back({a, b});
}
sort(begin(v), end(v));
์ด๋ ๊ฒ ํ๊ฐ์ ์ฑ์ ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
int ans = 1;
int tmp = 0;
for (int i=1; i<N; ++i) {
if (v[tmp].second < v[i].second) continue;
++ans; tmp = i;
}
๊ทธ ์ฑ์ ์์ 1๋ฑ์ธ ์ ๋ ๋ฌด์กฐ๊ฑด ํฌํจ์์ผ๋๊ณ
๋ค๋ฅธ ์ฑ์ ๊ธฐ์ค์ผ๋ก ๊ณ์ ๋น๊ตํ๋ฉด์ ํ์ด๋ด๋ฉด ๋๋ค.
ํ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ์์ผ๋จ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๊ฑธ๋ก๋ง ๋น๊ตํ๋ฉด ๋จ.
1781. ์ปต๋ผ๋ฉด
์ด ๋ฌธ์ ์ ๊ทธ๋ฆฌ๋ํจ์ ๋ฐ๋๋ผ์ธ์ด๋ผ๋ ์์ฑ์์ ๋์จ๋ค.
#define MAX 200001
vector<int> v[MAX];
...
int d,r;
for (int i=0; i<N; ++i) {
cin >> d >> r;
v[d].push_back(r);
}
์๋ ๋ง๊ฐ๊ธฐํ๋ณ ๋ณด์์ ๋ํ vector ๋ฐฐ์ด์์ MAX๋ฅผ ์ฌ์ฉํ์ง ์์๋ค.
unordered_set ๊ฐ์ ๊ฑฐ๋ฅผ ์ฌ์ฉํด์ ์ธ๊ธ๋ ๋ง๊ฐ๊ธฐํ๋ง ๊ด๋ฆฌํด์ฃผ๋ ค ํ๋๋ฐ
๋ฌธ์ ๋ ๋ง๊ฐ๊ธฐํ์ด ์๋ ๋ ์ง์๋ ์์
ํ ์ ์๋ค๋ ๊ฑฐ๋ฅผ ๋์ณค์๋ค.
priority_queue<int, vector<int>, less<int>> reward;
for (int i=N; i>=1; --i) {
for (const auto& x : v[i]) reward.push(x);
if (reward.empty()) continue;
ans += reward.top(); reward.pop();
}
์ฌ๊ธฐ์ ํต์ฌ์ ๋ง๊ฐ๊ธฐํ์ ์ญ์์ผ๋ก ์ก๊ณ ๊ฐ๋ค๋ ๊ฒ. 11501. ์ฃผ์ ๋ฌธ์ ๋ํ ์ด๋ฐ ๋๋์ผ๋ก ํด๊ฒฐํ๋ค.
์ต๋ ๋ง๊ฐ๊ธฐํ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ด๋ฉฐ
๊ทธ๋ฌ๊ธฐ๋๋ฌธ์ greedyํ๊ฒ ํ ์ ์์๋ค.
ํ์ฌ ์ผ์ฐจ ์ดํ์ ๋ง๊ฐ๊ธฐํ์ธ ์ผ๋ค์ ์ ๋ถ ํ ์ ์์ผ๋๊น.
๊ทธ๋ฌ๋ฉด ๊ทธ ๋ง์ ๊ฒ๋ค ์ค์ ๋๊ตฌ๋ฅผ ์ ํํ๋๊ฐ? => max heap์ผ๋ก ์ฒ๋ฆฌ
1541. ์์ด๋ฒ๋ฆฐ ๊ดํธ
์กฐ๊ธ ํค๋ฉ ์ด์ ๋ -(minus) ๋ฅผ ๋ง๋ ์ํ์์
๋ค์ -(minus) ๋ฅผ ๋ง๋ ๋๊น์ง ์ ์ฅ์ ํด์ค์ผํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ด๋ค.
string s; cin >> s;
string cur = "";
int ans = 0;
int minus_store = 0; bool is_minus = false;
for (const auto& c : s) {
if (c != '+' && c != '-') {
cur += c;
continue;
}
if (c == '+') {
if (is_minus) minus_store += stoi(cur);
else ans += stoi(cur);
cur.clear();
continue;
}
if (c == '-') {
if (is_minus) {
minus_store += stoi(cur);
ans -= minus_store; minus_store = 0;
}
else {
is_minus = true;
ans += stoi(cur);
}
cur.clear();
}
}
๊ทธ๋ฌ๋ค๋ณด๋ ๋ณต์กํด์ก๋ค.
๋ฟ๋ง์๋๋ผ ๋ฃจํ ํ์ถํ๊ณ ๋จ์ leftover๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ๋ ์ฉ ๋งค๋๋ฝ์ง ์์๋ค.
๊ทผ๋ฐ ์๊ฐํด๋ณด๋ฉด ๊ทธ๋ฅ is_minus ๋ฉด
๊ฐ๋จํ๊ฒ ๋นผ๋ฉด ๋๊ณ ์๋๋ฉด ๋ํ๋ฉด ๋๋ค.
for (int i=0; i<=input.length(); ++i) {
if (input[i] == '-' || input[i] == '+' || i == input.length()) {
if (is_minus) ans -= stoi(num);
else ans += stoi(num);
num.clear();
}
else num += input[i];
if (input[i] == '-') is_minus = true;
}
๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ 2๊ฐ์ง์ธ๋ฐ
- is_minus๋ฅผ ๊ฐฑ์ ํ๋ ๋ถ๋ถ๊ณผ ans๋ฅผ ๊ฐฑ์ ํ๋ ๋ถ๋ถ์ ๋ถ๋ฆฌ
- ์ํ๋ฅผ input.length()๊น์ง ํ๋ ๊ฒ
is_minus๊ฐ ๊ณ์ ์ ๋ฐ์ดํธ ๋๋ ๊ฑฐ๋ ์ด์ฉ ์ ์๋ค.
2812. ํฌ๊ฒ ๋ง๋ค๊ธฐ
์ ๋ ฌ ๊ฐ์ ๊ฒ ์ ํ ์๋ ๊ทธ๋ฅ ์คํ์ ์ง์ด๋ฃ์ผ๋ฉด์ ํธ๋ ๋ฌธ์ .
์ด ๋ฌธ์ ์์๋ greedyํจ์
๊ทธ๋ฅ ์คํ์ top๊ณผ ๋น๊ตํ๋ ๊ฑธ๋ก ๋ง์กฑ๋๋ค.
for (int i=0; i<N; ++i) {
while (!stk.empty() && cnt < K && num[i] > stk.top()) {
stk.pop(); ++cnt;
}
stk.push(num[i]);
}
while (cnt < K) {
++cnt;
stk.pop();
}
์ผ๋จ ์คํ์ ์ง์ด๋ฃ์ผ๋ฉด์ ๋ค์ ๋๋ค์ top๊ณผ ๋น๊ต๋ฅผ ์งํ.
์ด๋ฒ์ ์ง์ด๋ฃ์ num[i]๊ฐ top๋ณด๋ค ํฌ๋ค๋ฉด
๋ชฉํ์ธ "๊ฐ์ฅ ํฐ ์"์ ๋ฉ์ด์ง๋ฏ๋ก pop์ ํด์ค๋ค.
์ต๋ K๋ฒ ๊น์ง๋ง pop์ด ๊ฐ๋ฅํ๋ฏ๋ก ์ด์ ๋ํ ์กฐ๊ฑด์ ๊ฑธ์ด์ค๋ค.
๋ฃจํ ํ์ถ์ดํ์ K๋ฒ์ ๋ค ๋ชป์ฑ์ ๋ค๋ฉด
์คํ์ ๊ณผํ๊ฒ ๋ค์ด์์ผ๋ฏ๋ก ์๋ง๊ฒ popํด์ค๋ค.
11501. ์ฃผ์
์ด ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์ ํ ์ญ๋ฐฉํฅ์ ๋ํด ์ฒ์์ ์๊ฐ ๋ชปํ๋ค.
๋๋ ๋๋ฆ๋๋ก greedyํ ํ๋จ์ด
- ์ฃผ๊ฐ์ ๋จ์กฐ์ฆ๊ฐ๊ฐ ๋ฉ์ถฐ์ง๋ ๋ถ๋ถ๋ค์ ์ถ์
- ๋ค์ ๋จ์กฐ์ฆ๊ฐ๊ฐ ์์๋๋ ๋ถ๋ถ์ ์ด์ spike์ ๋น๊ต
- ๋ง์ฝ ์ด์ ๋ณด๋ค ๋๋ค๋ฉด ํ์ฌ๊น์ง ๊ธฐ๋ค๋ ธ๋ค ํ๋๊ฒ ๋ง์ผ๋ฏ๋ก ์ด์ spike์์๋ ํ์ง ์๋๋ค
- ๋ฎ์๋ค๋ฉด ์ด์ ์ง์ ์์ ํ๋ค
์ด๋ฐ ์์ผ๋ก ๊ณ์ฐํ๋ค.
์๋นํ ๋ณต์กํ๊ณ , ๊ฒฐ๊ณผ ๋ํ ํ๋ ธ์ผ๋ฉฐ
์๊ฐ์ด๊ณผ์ด๊ณ ๋ญ๊ณ ๋ฐ์ ธ๋ณผ ์๋ ์์๋ค.
ll ans = 0; int temp_max = 0;
for (int i=N-1; i>=0; --i) {
temp_max = max(temp_max, num[i]);
ans += (temp_max - num[i]);
}
์๊ฐํ๋ฆ์ ๊ฑฐ๊พธ๋ก ์ก์์ ํ๋จํ๋๊ฒ ์ง์ง dope ๊ทธ์์ฒด๋ค.
๊ทธ๋ฅ ์ต๋๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๊ทธ๊ฑฐ ๊ธฐ์ค์ผ๋ก
temp_max ๋ฅผ ๋ณ๊ฒฝํ๊ณ num[i] ์์ ์ฐจ์ด๋ฅผ ๋ํด์ฃผ๋ฉด ๋๋ค.
1700. ๋ฉํฐํญ ์ค์ผ์ค๋ง
๊ธฐ์ค์ ์ก๊ธฐ ์ด๋ ค์ ๋ค.
- ๊ทธ๋ฅ ๋ง์ด ๋ฑ์ฅํ ๋๋ค์ ๋จผ์ ๊ฝ์๋๊น?
- ๋จผ์ ๋ฑ์ฅํ ์ ๋ค์ ์ง์ด๋ฃ์๊น?
๋ญ๊ฐ ๋๊ฑด greedyํ ํ๋จ์ ์๋๋ค. ๊ทธ๋ฅ ์ฐ๊ธฐ๋ ๊ฑฐ์ ๋ถ๊ณผํ๋ค.
๊ถ๊ทน์ ์ผ๋ก ๊ฐ ์ค์ผ์ค์ด ์ฌ์ฉ ์์๋๋ก ์ธํ์ด ๋ค์ด์ค๋๋ฐ
์ด๋ป๊ฒ ์ด๊ฑธ ๊ทธ๋๊ทธ๋ ํ๋จํ ์ ์์๊น๋ผ๋ ์๋ฌธ์ด ํ๋ฆฌ์ง ์์๋ค.
int N, K; cin >> N >> K;
for (int i=0; i<K; ++i) {
cin >> schedule[i];
}
int ans = 0;
for (int i=0; i<K; ++i) {
bool flag = false;
for (int j=0; j<N; ++j) {
if (multitap[j] == schedule[i]) {
flag = true;
break;
}
}
if (flag) continue;
for (int j=0; j<N; ++j) {
if (multitap[j] == 0) {
flag = true;
multitap[j] = schedule[i];
break;
}
}
if (flag) continue;
int prev = -1, idx = -1;
for (int j=0; j<N; ++j) {
int tmp = 0;
for (int t=i+1; t<K; ++t) {
if (multitap[j] == schedule[t]) break;
++tmp;
}
if (tmp > prev) {
prev = tmp; idx = j;
}
}
multitap[idx] = schedule[i];
++ans;
}
๊ฐ ์ค์ผ์ค์ ๋จผ์ ๋๊ฐ์ง ๊ธฐ๋ณธ์ ๋ต์ด ์๋๋ฐ
- ์ด๋ฏธ ๊ฝํ์์ผ๋ฉด ๋น์ฐํ ํจ์ค
- ๋น๊ณต๊ฐ์ด ์์ผ๋ฉด ์ฝ์
๊ทธ๋ฆฌ๊ณ ์ด ๋์ ๋ง์กฑํ์ง ๋ชปํ์ ๋ ํ์ฒ๋ฆฌ๋ฅผ ํ๋ ํ๋ฆ๋ถ๋ฆฌ๊ฐ ํ์ํ๋ค.
์ฌ๊ธฐ์๋ ์๋นํ ์ธ์์ ์ธ ๊ฒ์
๋ชจ๋ ๋ฉํฐํญ๋ค์ ์ํํ๋ฉด์
ํ์ฌ ์ค์ผ์ค ์ดํ์ ์ค์ผ์ค๋ค ์ค์์
ํ์ฌ ๋ฉํฐํญ๊ณผ ์ผ์นํ๋ ์๊ฐ์ ์ฃผ๋ชฉํ๋ค๋ ๊ฒ์ด๋ค.
์ด๊ฒ์ ํตํด "๊ฐ์ฅ ๋์ค์ ์ฌ์ฉ๋๋ ์ค์ผ์ค"์ ์ฐพ๋๋ค.
๋ฌธ์ ์์ฒด๊ฐ ํ๋ฌ๊ทธ๋ฅผ ๋นผ๋ ํ์๋ฅผ ์ค์ฌ์ผ ํ๋๊ฒ ๋ชฉํ์ด๋ฏ๋ก
์ด๋ฐ ์์ผ๋ก ํ๋จํ๋ ๊ฒ์ด greedyํ ํ๋จ์ด๋ผ๊ณ ํ ์ ์๋ค.
3์ฃผ์ฐจ : ์ด๋ถํ์
๋ชฉ์ฐจ
- ME
- ํ์
1253. ์ข๋ค
๋ฌธ์ ์์ฝ
์ด๋ค ์๊ฐ ๋ค๋ฅธ ์ 2๊ฐ์ ํฉ์ผ๋ก ํํ๋ ์ ์๋ค๋ฉด,
์ด ์๋ฅผ "์ข๋ค(GOOD)" ๋ผ๊ณ ํ์.
N ๊ฐ์ ์๊ฐ ์ฃผ์ด์ก์ ๋, ์ด ๋ค์ค ์ข์ ์๋ ๋ช๊ฐ์ธ์ง ๊ตฌํด๋ณด์.
์์)
1 2 3 4 5 6 7 8 9 10 ์ด ์ฃผ์ด์ง๋ฉด
3,4,5,6,7,8,9,10์ ์ข๋ค.
ํด์ค
1. ์ ๋ ฅ๋ฐ๊ธฐ
vector<int> v;
...
cin >> N;
for (int i=0; i<N; ++i) {
int x; cin >> x; v.push_back(x);
}
sort(begin(v), end(v));
์ด๋ถํ์์ ์ํด N๊ฐ์ ์๋ค์ ๋ฒกํฐ์ ๋ด๊ณ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ํ๋ค.
2. ์ด๋ถํ์
int ans = 0;
for (int i=0; i<N; ++i) {
int start = 0, end = v.size()-1;
while (start < end) {
if (start == i) { ++start; continue; }
if (end == i) { --end; continue; }
int sum = v[start]+v[end];
if (sum == v[i]) { ++ans; break; }
if (sum > v[i]) --end;
else ++start;
}
}
2-a) ๋ฒกํฐ์ ๋ด๊ธด ์๋ค์ ํ๋์ฉ ์ํํ๋ค.
for (int i=0; i<N; ++i) {
...
}
2-b) ์ด๋ถํ์์ ์ํ start, end ์ค์
for (int i=0; i<N; ++i) {
// ์ถ๊ฐ
int start = 0, end = v.size()-1;
...
}
ํ์์ ๊ธฐ์ค์ ์ธ๋ฑ์ค๋ก ์ก์๋ค.
๋ฐ๋ผ์ start๋ ๊ฐ์ฅ ์์ 0์, end๋ ๊ฐ์ฅ ํฐ v.size()-1์ ์ก๋๋ค.
2-c) ํฌํฌ์ธํฐ๋ก ํ์
int ans = 0;
for (int i=0; i<N; ++i) {
int start = 0, end = v.size()-1;
while (start < end) {
if (start == i) { ++start; continue; }
if (end == i) { --end; continue; }
int sum = v[start]+v[end];
if (sum == v[i]) { ++ans; break; }
if (sum > v[i]) --end;
else ++start;
}
}
์ํํ๋ฉด์ ํด๋น ์๊ฐ
์๊ธฐ ์์ ์ ์ ์ธํ ๋ค๋ฅธ ๋ ์์ ํฉ์ผ๋ก ๋ํ๋ผ ์ ์๋์ง๋ฅผ ํ๋จํ๋ฉด ๋๋ค.
์ด๋ถํ์ ๋ฃจํ์ ํ์ถ ์กฐ๊ฑด์ start < end ๋ก ์ก์๋๋ฐ,
๊ทธ ์ด์ ๋ ์๊ธฐ ์์ ์ ์ ์ธํ ๋ค๋ฅธ ๋ ์์ ํฉ์ผ๋ก ๋ํ๋ผ ์ ์์ด์ผ
GOOD์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ฝ start ๋ end๊ฐ ํ์ฌ ํ์ ์ธ๋ฑ์ค i์ ๊ฐ์์ง๋ ์ํฉ์ด ์จ๋ค๋ฉด
ํฌํฌ์ธํฐ์ ๋
ผ๋ฆฌ์ ๋ฐ๋ผ ์์ฐ์ค๋ฝ๊ฒ ++start, --end๋ฅผ ํด์ฃผ๋ฉด ๋๋ค.
ans๋ฅผ ํตํด GOOD์ธ ์์ ๊ฐ์๋ฅผ ๊ด๋ฆฌํ๋ค.
๋ง์ฝ sum์ด ํ์ฌ ํ์ํ๋ ์๋ณด๋ค ์ปธ๋ค๋ฉด ๋น์ฐํ --end๋ฅผ ํด์ฃผ๊ณ ,
์์๋ค๋ฉด ++start๋ฅผ ํด์ฃผ๋ฉด ๋๋ค.
์ ์ฒด ์ฝ๋
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N;
vector<int> v;
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N;
for (int i=0; i<N; ++i) {
int x; cin >> x; v.push_back(x);
}
sort(begin(v), end(v));
int ans = 0;
for (int i=0; i<N; ++i) {
int start = 0, end = v.size()-1;
while (start < end) {
if (start == i) { ++start; continue; }
if (end == i) { --end; continue; }
int sum = v[start]+v[end];
if (sum == v[i]) { ++ans; break; }
if (sum > v[i]) --end;
else ++start;
}
}
cout << ans;
return 0;
}
2343. ๊ธฐํ ๋ ์จ
๋ฌธ์ ์์ฝ
์ ๋ ฅ์ผ๋ก ๊ฐ์ ๊ฐ์ N, ๋ธ๋ฃจ๋ ์ด ๊ฐ์ M์ด ์ฃผ์ด์ง๋ค
N๊ฐ์ ๊ฐ์๋ฅผ M๊ฐ์ ๋ธ๋ฃจ๋ ์ด์ ๋๋ ๋ด์์ ๋
๊ฐ์ฅ ๊ฐ์์๊ฐ์ ๊ธธ๊ฒ ๋ด๊ณ ์๋ ๋ธ๋ฃจ๋ ์ด๊ฐ ๊ธฐ์ค์ด ๋๋ฉฐ
์ด๋ฅผ ๋ธ๋ฃจ๋ ์ด์ ํฌ๊ธฐ๋ผ๊ณ ํ๋ค.
์์)
9 3 => (N, M)
1 2 3 4 5 6 7 8 9 => N๊ฐ์ ๊ฐ์์๊ฐ
M์ด 3์ธ ๊ฒฝ์ฐ์ด๋ฏ๋ก,
(1 2 3 4 5) (6 7) (8 9) ์ด๋ ๊ฒ ๋ด์๋ค๋ฉด
๊ฐ ๋ธ๋ฃจ๋ ์ด์ ํฌ๊ธฐ๋ 15, 13, 17์ด ๋๋ค.
๊ฐ์ฅ ๊ธด ๊ฐ์์๊ฐ์ ๋ด์ ๋ธ๋ฃจ๋ ์ด๋ 17์ด๋ฉฐ ์ด๊ฒ์ด ๋ธ๋ฃจ๋ ์ด์ ํฌ๊ธฐ๊ฐ ๋๋ค.
๋จ, ๊ฐ์๋ ์ฐ์๋๊ฒ ๋ด์์ผํ๋ค.
์์ ๊ฐ์ ๊ฒฝ์ฐ (1 2 6 9) (3 5) (4 7 8) ์ด๋ฐ ์์ผ๋ก ๋ด์ ์ ์๋ค.
์ฆ, N๊ณผ M์ด ์ฃผ์ด์ก์๋ ๊ฐ๊ฐ์ ๋ธ๋ฃจ๋ ์ด์
์ฐ์๋ ๊ฐ์๋ฅผ ๋ด์ ์ ์๋ ์๋ง์ ๋ฐฉ๋ฒ๋ค ์ค
๊ฐ์ฅ ์์ ๋ธ๋ฃจ๋ ์ด์ ํฌ๊ธฐ๋ฅผ ๊ตฌํด๋ณด์.
ํด์ค
1. input ๋ฐ ์ด๋ถํ์ ์ ์ low, high ์ค์
vector<int> v;
int N,M;
...
int total = 0;
cin >> N >> M;
for (int i=0; i<N; ++i) {
int x; cin >> x; v.push_back(x);
total += x;
}
int l = *max_element(begin(v), end(v)), r = total;
์ด๋ถํ์์ ๊ธฐ์ค์ ๊ฐ์ ์๊ฐ ์ ๊ธฐ์ค์ผ๋ก ํ ๊ฒ์ด๋ค.
์ด๋ค์์ผ๋ก ๊ฐ์๋ค์ ๋ธ๋ฃจ๋ ์ด๋ค์ ๋ด๊ฑด ์๊ด์์ด
๊ฐ์์๊ฐ๋ค ์ค ๊ฐ์ฅ ๊ธด ๊ฐ์์๊ฐ์ ํํ์ผ๋ก ์ก์ ์ ์๋ค.
์ด๋ป๊ฒ ์ชผ๊ฐ๋ ์ง ๊ทธ ์ง๋จ ์ค์๋ ๊ฐ์ฅ ๊ธด ๊ฐ์๊ฐ ๋ค์ด์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ.
๋น์ฐํ ์ํ์ ์ ๋ถ ๊ฐ์์๊ฐ์ ํฉํ ๊ฐ์ด ๋ ๊ฒ์ด๋ค.
2. ์ด๋ถํ์
while (l <= r) {
int mid = (l+r) / 2;
int sum = 0;
int cnt = 0;
for (int i=0; i<N; ++i) {
if (sum + v[i] > mid) {
sum = 0;
++cnt;
}
sum += v[i];
}
if (sum != 0) ++cnt;
if (cnt > M) l = mid+1;
else r = mid-1;
}
cout << l;
2-a) ๊ฐ์๋ณ๋ก ์ํํ๋ฉฐ mid๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌ
for (int i=0; i<N; ++i) {
if (sum + v[i] > mid) {
sum = 0;
++cnt;
}
sum += v[i];
}
sum์๋ค๊ฐ ๊ฐ์์๊ฐ (v[i]) ๋ฅผ ๋ํด๊ฐ๋ฉด์ mid๋ณด๋ค ์ปค์ง๋์ง๋ฅผ ๊ฒ์ฆํ๋ค.
๋ง์ฝ ์ปธ๋ค๋ฉด ํ๋์ ๋ธ๋ฃจ๋ ์ด๋ก ๋ถ๋ฆฌ์ํจ๋ค.
๋ฐ๋ผ์ sum์ 0์ผ๋ก ์ด๊ธฐํํ๊ณ ๋ธ๋ฃจ๋ ์ด ๊ฐ์ cnt๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
2-b) cnt๊ฐ M๋ณด๋ค ํฌ๋ค๋ฉด l์ mid+1๋ก
for (int i=0; i<N; ++i) {
...
}
if (sum != 0) ++cnt;
๊ฒฝ๊ณ๊ฐ์ ์ ์ํ์.
๋ง์ง๋ง์ ์ ๋ฌํ๊ฒ ๊ฒฝ๊ณ์ธ mid๋ฅผ ์ด๊ณผํ๋ฉด์ ํ๋์ ๋ธ๋ฃจ๋ ์ด๋ก ๋ถ๋ฆฌํ ์๋ ์๊ณ ,
๊ทธ๋ ์ง ์์ ์ํ์์ ๊ทธ๋ฅ for loop ๋ฒ์ ์กฐ๊ฑด๋๋ฌธ์ ๋์๋ฒ๋ฆด ์๋ ์๋ค.
๋ฐ๋ผ์ for loop์ ๋น ์ ธ๋์จ ๋ค์๋ sum์ ๋ํด ๊ฒ์ฆ์ ํด์
0์ด ์๋๋ฉด ๋ธ๋ฃจ๋ ์ด ๊ฐ์๋ฅผ ์ฆ๊ฐ์์ผ์ค๋ค.
2-c) ์ด๋ถํ์
if (cnt > M) l = mid+1;
else r = mid-1;
ํ์ฌ ๋ถ๋ฆฌํด๋ธ ๋ธ๋ฃจ๋ ์ด ๊ฐ์๊ฐ ์๊ตฌ๋๋ ์ ํ์ฌํญ์ธ M๋ณด๋ค ๋ง์ ๊ฒฝ์ฐ:
ํํ์ ํค์์ค์ ๋ธ๋ฃจ๋ ์ด๋ฅผ ๋๋๋ ๊ธฐ์ค์ ๋์ฌ์ค๋ค.
์ด๋ฅผ ํตํด ๋ธ๋ฃจ๋ ์ด ๊ฐ์๋ฅผ ์ค์ด๊ณ M์ ๊ทผ์ ํ๋๋ก ํ๋ค.
์์ ๊ฒฝ์ฐ๋ vice versa.
2-d) ๊ฒฐ๊ณผ ์ถ๋ ฅ
cout << l;
์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค๋ณด๋ฉด ์์ฐ์ค๋ฝ๊ฒ l์ด ๊ณง ๋ต์ด ๋๋ค.
์ด๋ถ ํ์์ ์์์ด๋ค.
์ ์ฒด ์ฝ๋
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N,M;
vector<int> v;
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int total = 0;
cin >> N >> M;
for (int i=0; i<N; ++i) {
int x; cin >> x; v.push_back(x);
total += x;
}
int l = *max_element(begin(v), end(v)), r = total;
while (l <= r) {
int mid = (l+r) / 2;
int sum = 0;
int cnt = 0;
for (int i=0; i<N; ++i) {
if (sum + v[i] > mid) {
sum = 0;
++cnt;
}
sum += v[i];
}
if (sum != 0) ++cnt;
if (cnt > M) l = mid+1;
else r = mid-1;
}
cout << l;
return 0;
}
Review
9460. ๋ฉํ
๊ฐ์ฅ ์ด๋ ค์ด ๋ฌธ์ ์๋ค.
๋ฉํ์ ๊ฐ๊ฒฉ์ ๊ธฐ๋ฐํด์ ์ํํ์ ์๋์ ๊ฐ์ด ์ก์๋ค.
double l = 0.0, r = 200000000.0;
ํ์ง๋ง ๋ค์๋ถํฐ ๋ฌธ์ ๊ฐ
์ฒซ์งธ๋ก๋ ์ด๋ป๊ฒ ์ด๋ถ ํ์ loop๋ฅผ ํ์ถํ๋ ์กฐ๊ฑด์ ์ก์์ผํ ์ง ๊ฐ์ด ์์๋ค.
while (r - l > 0.01) {...}
์ด๊ฑธ ๋ณด๋ฉฐ ์ถฉ๊ฒฉ์ด ๋ ๊ฒ ์ด๋ป๊ฒ ์์์ ํ์๋ฆฌ๊น์ง๋ง ์ถ๋ ฅํ๋ค๋ ๊ฑฐ์์
์ด๋ฐ ์กฐ๊ฑด์ ์ก์๋ด๋ ๊ฑด์ง ์๋์ ์ ๋ง๊ฐ์ด ๋ค์๋ค.
๊ณ ๋ฉ๋ ๋์๋ถ๋ฑ์ ์ฆ๋ช
ํ๋ ๋ฌธ์ ๋ฅผ ๋ณด๋ ๊ธฐ๋ถ์ด๋ค.
๋๋ฒ์งธ๋ ์ด๋ถํ์ ๊ทธ์์ฒด์ ๋ํ ์๊ธฐ์ด๋ค.
bool check(const double& max_dist) {
int l = v[0].second, r = v[0].second;
int cnt = 1;
for (int i=1; i<n; ++i) {
if(v[i].second < l) l = v[i].second;
if(v[i].second > r) r = v[i].second;
if (2 * max_dist >= (r-l)) continue;
else {
l = r = v[i].second;
++cnt;
}
}
if (cnt > k) return false;
else return true;
}
์ผ๋จ check๋ผ๋ ํจ์์ ๋์ง๋ ํ๋ผ๋ฏธํฐ๋ฅผ max_dist ๋ผ๊ณ ์ ์ํ๋ ๊ฒ์ด๋ค.
check์์๋ ์ด๊ฑธ ๊ธฐ์ค์ผ๋ก ํด์ metal๋ค์ ํ์ํ๋ฉฐ
ํ์ฌ metal๊น์ง์ ์ต๋-์ต์ ๊ฐ๊ฒฉ๊ณผ 2 * max_dist ๋ฅผ ๋น๊ตํ๋ค.
๋ง์ฝ ๊ฐ๊ฒฉ์ด 2 * max_dist ๋ณด๋ค ํฌ๋ค๋ฉด ์ด๊ฑด ํฐ๋์ ๋ง๋ค์ด์ผํ๋ ์ํฉ์ด๋ค.
์ด๋ฐ ์ํฉ์์ ํฐ๋์ ๋ง๋ค์์ผ๋ ์ต๋ ์ต์๋ฅผ ๋ค์ ๊ฐฑ์ ํด์ฃผ๋ ๊ณผ์ ์ ๋๋ฐํ๋ค.
์ด๋ ๊ฒ ์นด์ดํ
ํ cnt๋ฅผ ๊ฐ์ง๊ณ max ํฐ๋๊ฐ์ k์ ๋น๊ตํ๋ค.
k๋ณด๋ค ์ปธ๋ค๋ฉด ๋ถ๊ฐ๋ฅํ ์ํฉ์ด๋ผ false, ์๋๋ฉด true๋ฅผ ๋ฐํํ๋ค.
๋ค์ ์ด๋ถํ์ ๋ฃจํ๋ก ๋์์์ ์ํํ์ ๊ฐฑ์ ํด์ค๋ค.
if (check(mid)) r = mid;
else l = mid;
check๋ฅผ ํต๊ณผํ ๊ฑฐ๋ฉด ํฐ๋ ๊ฐ์๊ฐ ๋๋ํ ๊ฑฐ๋ผ ์ํ์ ๋ฎ์ถฐ์ค๋ค.
max_dist๊ฐ ๋ ์ค์ด๋ ์ฌ์ ๊ฐ ์๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ.
๋ฐ๋๋ก check๋ฅผ ํต๊ณผํ์ง ๋ชปํ๋ค๋ฉด ํฐ๋์ด ๋ ํ์ํ ์ํฉ์ด๋ผ
ํํ์ ๋์ฌ์ max_dist๋ฅผ ๋๋ ค์ค๋ค.
14233. ์ ๋ ์ฌ์ฅ
๋ฌธ์ ์์ฒด๊ฐ ๋ญ์๋ฆฌ์ธ์ง ์ ์ดํด๊ฐ ์๋๋ค.
ํ์ด ์์ฒด๋ ๊ทธ๋ฅ Ai[i]์ k * (i+1)์ ๋น๊ตํ๋ ๋ฌธ์ ์ธ๋ฐ
๋ค์ ์ฝ์ด๋ด๋ ๋ฌธ์ ๊ฐ ์ ํ ๊ทธ๋ฐ์์ผ๋ก ์ฝํ์ง ์๋๋ค.
2512. ์์ฐ
์ฒ์์ ์ํํ์
int start = budget[0], end = budget[N-1];
// int start = 0, end = budget[N-1];
์ด๋ ๊ฒ ์ค์ ํด์ ํด๋งธ๋ค.
์์ฐ์์ด ์ ๊ฒ ์ฃผ์ด์ง๋ ๊ฑธ ๋์ณค๋ค.
mid๋ฅผ ๊ทธ๋๋ก ์ถ๋ ฅํ ์ ์์ด์ ์ด์ ๊ฐ์ ์ถ์ ํ๋ ๋ณ์๋ฅผ ๋๋ ๊ฒ๋ ์ค์ํ๋ค.
2110. ๊ณต์ ๊ธฐ ์ค์น
- 9460 ๋ฉํ
- 2343 ๊ธฐํ ๋ ์จ
์ด๋ฐ ๋ฌธ์ ๋๋์ด๋ค.
์ธ๋ฑ์ค ๊ธฐ๋ฐ์ผ๋ก bs ํ๋๊ฒ ์๋๋ผ
์ด๋ค ๊ฐ๊ฒฉ์ ๊ธฐ๋ฐ์ผ๋ก ํด์ ์ขํ๋๊ฐ๋ฉฐ ๋ต์ ์ฐพ๋.
1920. ์ ์ฐพ๊ธฐ
์ค๋ฆ ์ฐจ์ ์ ๋ ฌํ ๊ฐ ์ ์๋ง๋ค ๋๋ฉด์ ์ด๋ถํ์ํ๋ฉด ๋จ.
2467. ์ฉ์ก
๊ทธ๋ฅ ๋ฌด๋ํ ํฌํฌ์ธํฐ
2์ฃผ์ฐจ : BFS
๋ชฉ์ฐจ
- ME
- ํ์
1707. ์ด๋ถ ๊ทธ๋ํ
๋ฌธ์ ์์ฝ
๊ทธ๋ํ์ ์ ์ ๋ค์ ๊ฐ์ V, ๊ฐ์ ๋ค์ ๊ฐ์ E๊ฐ ์ฃผ์ด์ง๋ค.
๊ฐ ์ ์ ์ ๋ฒํธ๋ฅผ ๋ถ์ฌ๋ฐ๋๋ค : 1, 2, ..., V
E๊ฐ์ ์ค์ ๊ฑธ์ณ์ ๊ฐ์ ์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค.
์ ๋ณด๋ u, v ํํ๋ก ์ฃผ์ด์ง๋ค.
ex) V = 4, E = 4
4 4 - (V, E)
1 2
2 3
3 4
4 2
์ด ๋, ์ด๋ถ ๊ทธ๋ํ์ด๋ฉด "YES", ์๋๋ฉด "NO"๋ฅผ ์ถ๋ ฅํ๋ค.
์ด๋ถ ๊ทธ๋ํ (Bipartite Graph)๋?
๊ทธ๋ํ์ ์ ์ ์งํฉ์ ๋ ๊ฐ๋ก ๋ถํ ํ์ ๋,
๊ฐ ์งํฉ์ ์ํ ์ ์ ๋ผ๋ฆฌ๋ ์ธ์ ํ์ง ์๋๋ก ๋ถํ ํ ์ ์๋ ๊ทธ๋ํ
ํด์ค
๊ทธ๋ํ์ ๋ชจ๋ vertex๋ฅผ 2๊ฐ์ง ์๊น๋ก ์น ํ๋ ์ํฉ์ ์๊ฐํ์.
์ด๋ ๋ชจ๋ edge๊ฐ 2๊ฐ์ง ์๊น์ ํฌํจํ ์ ์๋ค๋ฉด,
์ด๋ฅผ ์ด๋ถ ๊ทธ๋ํ๋ผ๊ณ ํ ์ ์๋ค.

1. Graph ์ ๋ ฅ๋ฐ๊ธฐ
vector<int> graph[MAX];
...
for (int i=0; i<E; ++i) {
cin >> n1 >> n2;
graph[n1].push_back(n2);
graph[n2].push_back(n1);
}
์์ ๊ฐ์ด vector ๋ฐฐ์ด์ ํตํด์ ์
๋ ฅ๋ฐ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ง๋ค
์๋ฐฉํฅ์ผ๋ก push ํด์ค๋ค.
2. BFS ์ง์ ์ main ํจ์
// bool ํ์
์ด ์๋๋ค!
int visited[MAX];
...
for (int i=1; i<=V; ++i) {
if (!visited[i]) bfs(i);
}
if (is_bipartite()) cout << "YES" << '\n';
else cout << "NO" << '\n';
1 ~ V ๊น์ง ๋ชจ๋ vertex๋ฅผ ์ง์
์ ์ผ๋ก ํด์ bfs๋ฅผ ์งํํ๋ค.
๋ฐฉ๋ฌธํ๋ค๋ฉด ์ผ๋ ๊ทธ๋ ๋ฏ์ด bfs๋ฅผ ์งํํ์ง ์๋๋ค.
bfs๋ฅผ ๋ชจ๋ ์งํํ ํ, ๋ง์ง๋ง์ผ๋ก is_bipartite ํธ์ถ์ ํตํด
์ด๋ถ ๊ทธ๋ํ์ธ์ง ์๋์ง๋ฅผ ํ๋จํ๋ค.
bfs๋ ์์ํ๊ฒ ์๊น์ ์น ํ๋ ์ผ๋ง ์ํํ๋ค.
๋๋จธ์ง ๋ก์ง์ is_bipartite ํจ์์์ ์ํํ๋ค.
์ฃผ๋ชฉํด์ผํ ์ง์ ์ visited๋ฅผ ๊ด๋ฆฌํ ๋
int ํ์
์ผ๋ก ๊ด๋ฆฌํ๋ค๋ ๊ฒ์ด๋ค.
์ด๋ ์๊น 2๊ฐ์ ๋ํ ์๋ณ์ BLACK(1), WHITE(2)์
๋ฐฉ๋ฌธํ์ง ์์์์ ๋ํ๋ด๋ 0์ ๊ตฌ๋ถํ๊ธฐ ์ํจ์ด๋ค.
3. BFS
typedef enum {
BLACK = 1,
WHITE
} Color;
void bfs(int start) {
queue<int> q; q.push(start);
int color = BLACK;
visited[start] = color;
while (!q.empty()) {
int now = q.front(); q.pop();
if (visited[now] == BLACK) color = WHITE;
else if (visited[now] == WHITE) color = BLACK;
for (int i=0; i < graph[now].size(); ++i) {
int next = graph[now][i];
if (!visited[next]) {
visited[next] = color;
q.push(next);
}
}
}
}
๋งจ ์ฒ์ ์์์ ์ color = BLACK(1) ์ผ๋ก ์น ํ๋ค.
queue๋ฅผ ์ด์ฉํด์ bfs ๋ฃจํ๋ฅผ ๋๋ฆด ๋
if (visited[now] == BLACK) color = WHITE;
else if (visited[now] == WHITE) color = BLACK;
์์ ๊ฐ์ด ์๊น์ ๋ฐ์ ํด์ ์น ํด์ค๋ค.
์ด๋ ๊ฒ ์น ํ๋ ์์
์ ํด๋๊ณ ๋๋ฉด ๋ค์ ์์
์ผ๋ก ๋์ด๊ฐ๋ค.
4. is_bipartite
bool is_bipartite() {
for (int i=1; i<=V; ++i) {
for (int j=0; j<graph[i].size(); ++j) {
int n = graph[i][j];
if (visited[i] == visited[n]) return false;
}
}
return true;
}
bfs๋ฅผ ํตํด ๋ชจ๋ vertex๋ฅผ ์น ํ๊ณ ๋๋ฉด
์ด์ ์ด๋ถ ๊ทธ๋ํ์ธ์ง ์๋์ง๋ฅผ ํ๋จํ ์์
๋ง ๋จ์์๋ค.
graph[1], graph[2], ... , graph[V] ๊น์ง ์ํํ๋ฉด์
๊ฐ vertex์ ์ธ์ vertex๋ค์ ํ์ธํ๋ค. (graph[i].size() ๋งํผ)
์ด๋, ์ธ์ vertex๊ฐ ๊ฐ์ ์๊น์ด๋ผ๋ฉด ์ด๋ถ ๊ทธ๋ํ๊ฐ ์๋๋ค.
์ ์ฒด ์ฝ๋
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
#define MAX 20001
using namespace std;
vector<int> graph[MAX];
int V, E;
int visited[MAX];
typedef enum {
BLACK = 1,
WHITE
} Color;
void bfs(int start) {
queue<int> q; q.push(start);
int color = BLACK;
visited[start] = color;
while (!q.empty()) {
int now = q.front(); q.pop();
if (visited[now] == BLACK) color = WHITE;
else if (visited[now] == WHITE) color = BLACK;
for (int i=0; i<graph[now].size(); ++i) {
int next = graph[now][i];
if (!visited[next]) {
visited[next] = color;
q.push(next);
}
}
}
}
bool is_bipartite() {
for (int i=1; i<=V; ++i) {
for (int j=0; j<graph[i].size(); ++j) {
int n = graph[i][j];
if (visited[i] == visited[n]) return false;
}
}
return true;
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int K; cin >> K;
while (K--) {
cin >> V >> E;
int n1, n2;
for (int i=0; i<E; ++i) {
cin >> n1 >> n2;
graph[n1].push_back(n2);
graph[n2].push_back(n1);
}
for (int i=1; i<=V; ++i) {
if (!visited[i]) bfs(i);
}
if (is_bipartite()) cout << "YES" << '\n';
else cout << "NO" << '\n';
for (int i=1; i<=V; ++i) graph[i].clear();
memset(visited, 0, sizeof(visited));
}
return 0;
}
1697. ์จ๋ฐ๊ผญ์ง
๋ฌธ์ ์์ฝ
์๋น์ด๋ ๋์๊ณผ ์จ๋ฐ๊ผญ์ง์ ํ๊ณ ์๋ค. ์๋น์ด๊ฐ ์ ๋์ด๋ค.
์๋น์ด๋ ํ์ฌ ์ N(0 โค N โค 100,000)์ ์๊ณ ,
๋์์ ์ K(0 โค K โค 100,000)์ ์๋ค.
์๋น์ด๋ ๊ฑท๊ฑฐ๋ ์๊ฐ์ด๋์ ํ ์ ์๋ค.
- ๊ฑท๊ธฐ : ํ์ฌ ์์น๊ฐ X์ผ ๋, 1์ดํ X-1 ๋๋ X+1๋ก ์ด๋ํ๋ค.
- ์๊ฐ์ด๋ : ํ์ฌ ์์น๊ฐ X์ผ ๋, 1์ด ํ 2*X๋ก ์ด๋ํ๋ค.
์๋น์ด์ ๋์์ ์์น N, K๊ฐ ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
์๋น์ด๊ฐ ๋์์ ์ฐพ์ ์ ์๋ ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ์ ๊ตฌํด๋ณด์.
ํด์ค
1. Early Return
if (K <= N) {
cout << N - K;
return 0;
}
์๋น์ด์ ์์น (N)์ด ๋์์ ์์น (K)๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค๋ฉด
๊ฑท๊ธฐ๋ฅผ ํด์ 1์นธ์ฉ ๋ค๋ก ๊ฐ๋ ๊ฒ์ด ์ต์ ์ด๋ค.
์ด๋ฐ ๊ฒฝ์ฐ๋ bfs๋ฅผ ๋๋ฆฌ์ง์๊ณ ๋น ๋ฅด๊ฒ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
2. bfs ์ง์ ์ main
#define MAX 100001
int map[MAX];
...
bfs(N);
cout << map[K];
map[i] ๋
์๋น์ด๊ฐ i ์์น์ ๋๋ฌํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ต์ ์๊ฐ์ ์๋ฏธํ๋ค.
๋์์ ์์น๊ฐ K๋ก ์ฃผ์ด์ง๋ฏ๋ก,
์ ์์ ๋ฐ๋ผ map[K] ๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ต์ด ๋ ๊ฒ์ด๋ค.
3. bfs
bool visited[MAX];
bool check(int x) {
return x>=0 && x<MAX;
}
void bfs(int start) {
queue<int> q; q.push(start);
map[start] = 0; visited[start] = true;
while (!q.empty()) {
int now = q.front(); q.pop();
if (now == K) break;
if (check(now-1) && !visited[now-1]) {
map[now-1] = map[now] + 1;
visited[now-1] = true;
q.push(now-1);
}
if (check(now+1) && !visited[now+1]) {
map[now+1] = map[now] + 1;
visited[now+1] = true;
q.push(now+1);
}
if (check(now*2) && !visited[now*2]) {
map[now*2] = map[now] + 1;
visited[now*2] = true;
q.push(now*2);
}
}
}
map[start] = 0; visited[start] = true;
์์ํ๋ ์ง์ ์ ๋น์ฐํ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด 0์ด๋ฉฐ,
๋ฐฉ๋ฌธํ๋ค๊ณ ํ์ํ๋ฉฐ queue ๋ฃจํ๋ฅผ ์์ํ๋ค.
if (now == K) break;
๋์์ ์์น๋ฅผ ๋ง๋๋ ์๊ฐ ๋ฐ๋ก ํ์ถํ๋ค.
if (check(now-1) && !visited[now-1]) {
map[now-1] = map[now] + 1;
visited[now-1] = true;
q.push(now-1);
}
๋ค๋ก ๊ฑท๊ธฐ ๋ฅผ ํ ๋์ ๋ถ๋ถ์ ๊ฐ์ ธ์๋ดค๋ค.
๋๋จธ์ง ์ด๋๋ฐฉ์ ๋ํ ํ๋ฆ์ ๋์ผํ๋ค.
- ๋ฒ์ ์ฒดํฌ & ๋ฐฉ๋ฌธ ์ฌ๋ถ ์ฒดํฌ
- map[now] + 1 (1์ด๊ฐ ์ง๋ฌ์ผ๋๊น) ํ ๋นํ๊ธฐ
- ๋ฐฉ๋ฌธ ํ์ํ๊ธฐ
- queue์ push ํ๊ธฐ
์ ํ์ ์ธ ํ๋ฆ์ด๋ผ๊ณ ๋ณผ ์ ์๊ฒ ๋ค.
์ ์ฒด ์ฝ๋
#include <iostream>
#include <queue>
using namespace std;
#define MAX 100001
int N, K;
int map[MAX];
bool visited[MAX];
bool check(int x) {
return x>=0 && x<MAX;
}
void bfs(int start) {
queue<int> q; q.push(start);
map[start] = 0; visited[start] = true;
while (!q.empty()) {
int now = q.front(); q.pop();
if (now == K) break;
if (check(now-1) && !visited[now-1]) {
map[now-1] = map[now] + 1;
visited[now-1] = true;
q.push(now-1);
}
if (check(now+1) && !visited[now+1]) {
map[now+1] = map[now] + 1;
visited[now+1] = true;
q.push(now+1);
}
if (check(now*2) && !visited[now*2]) {
map[now*2] = map[now] + 1;
visited[now*2] = true;
q.push(now*2);
}
}
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N >> K;
if (K <= N) {
cout << N - K;
return 0;
}
bfs(N);
cout << map[K];
return 0;
}
Review
11123. ์ ํ๋ง๋ฆฌ... ์ ๋๋ง๋ฆฌ...
2์ฐจ์ map์์ #(์)์ด ์ํ์ข์ฐ๋ก ๋ถ์ด์๋ ์งํฉ์
๋ช๊ฐ๊ฐ ๋์ค๋์ง ๋ฌป๋ ์ ํ์ ์ธ ๋ฌธ์ ์ด๋ค.
1194. ๋ฌ์ด ์ฐจ์ค๋ฅธ๋ค, ๊ฐ์.
์ด๋ํ๋ ์ฌ๋์ ์ขํ๊ฐ ์ฃผ์ด์ง๊ณ ํ์ถํ๊ธฐ ์ํ ์ต์ ์ด๋ํ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ .
๋จ์ํ ๋ฒฝ๋ง ์๋๊ฒ ์๋๊ณ , ์ด์ ์ ๋ฌธ์ ์กด์ฌ๋๋ฌธ์ ๊น๋ค๋ก์์ด ๋ฐ์ํ๋ค.
struct pos {
int y;
int x;
};
struct Info {
pos p;
int key;
int cnt;
};
bfs์์ queue์ ๋ด์ ์ ๋ณด์ธ Info ๋ฅผ ์์ ๊ฐ์ด ๊ตฌ์ฑํ๋ค.
bool visited[MAX][MAX][1 << 6];
๋ฐฉ๋ฌธํ์์ ํํํ๊ธฐ ์ํ visited๋ ์์ ๊ฐ์ด ๊ตฌ์ฑํ๋ค.
์ด์ ๋ ๋๊ฐ์ pos์ ๋๋ฌํด๋ key์ ์ํ์ ๋ฐ๋ผ์
๋ฐฉ๋ฌธ์ฌ๋ถ๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ.
int bfs(pos start) {
queue<Info> q; q.push({start, 0, 0});
while (!q.empty()) {
auto info = q.front(); q.pop();
int y = info.p.y, x = info.p.x, key = info.key, cnt = info.cnt;
if (map[y][x] == '1') return cnt;
for (int i=0; i<4; ++i) {
int ny = y+dy[i], nx = x+dx[i];
if (check(ny, nx, key)) {
if (is_key(ny ,nx)) {
visited[ny][nx][key] = true;
int shift = map[ny][nx] - 'a';
int nkey = key | (1 << shift);
q.push({{ny, nx}, nkey, cnt+1});
}
else if (is_door(ny, nx)) {
if (has_key(key, map[ny][nx])) {
visited[ny][nx][key] = true;
q.push({{ny, nx}, key, cnt+1});
}
}
else { // '.' ์ด๊ฑฐ๋ '1' ์ธ ๊ฒฝ์ฐ ('#'์ check์์ ๊ฑธ๋ฌ๋)
visited[ny][nx][key] = true;
q.push({{ny, nx}, key, cnt+1});
}
}
}
}
return -1;
}
int๋ฅผ ๋ฆฌํดํ๋ bfs์ด๋ค.
์ผ๋จ ํ์ถ๊ตฌ '1'์ ๋ง๋๋ฉด ๋ฐ๋ก cnt๋ฅผ ๋ฆฌํดํ๋ค.
ํต์ฌ์ ๋นํธ๋ง์คํน์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
- key๋ฅผ ๋ง๋ฌ์ ๊ฒฝ์ฐ์๋ OR ์ฐ์ฐ์ผ๋ก nkey๋ฅผ ๊ฐฑ์ ํ๋ค.
- door๋ฅผ ๋ง๋ฌ์ ๊ฒฝ์ฐ์๋ AND ์ฐ์ฐ์ผ๋ก key๋ฅผ ํ์ธํ๋ค.
bool has_key(int key, char door) {
int shift = door - 'A';
return key & (1 << shift);
}
key๋ ์๋๊ณ door๋ ์๋ ๊ฒฝ์ฐ์๋ ๊ทธ๋ฅ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๊ณ queue์ pushํ๋ค.
5014. ์คํํธ๋งํฌ
ํ์ฌ ์์น S, ๋ชฉํ ์์น G, ์ด F์ธต์ธ ๊ฑด๋ฌผ์ด ์ฃผ์ด์ง๋ค.
์๋ก U์ธต, ์๋๋ก D์ธต์ ์ด๋ํ ์ ์๋ค.
bool visited[MAX];
int floors[MAX];
...
cin >> F >> S >> G >> U >> D;
bfs(S);
if (visited[G]) cout << floors[G];
else cout << "use the stairs";
bfs๋ฅผ ์ผ๋จ ๋๋ฆฐ๋ค ๋ชฉํ G์ธต์ ๋ฐฉ๋ฌธํ ์ ์ด ์๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ
๊ฒฐ๊ณผ ์ถ๋ ฅํ๋ฉด๋๋ ๊ฐ๋จํ ๋ฌธ์ ์ด๋ค.
bfs์์๋ U, D์ ๋ฐ๋ผ ํ์ ํธ์ํ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
4179. ๋ถ!
์ด ๋ฌธ์ ์ ํต์ฌ์ ๋ถ์ด ํผ์ง๋ ๊ฒ์ ๋ฏธ๋ฆฌ fire_map์ ๋ด์๋๋ ๊ฒ์ ์๋ค.
struct pos {
int y, x;
};
struct Info {
int y, x, time;
};
int fire_map[MAX][MAX];
queue<pos> gq;
...
// input
for (int i=0; i<R; ++i) {
cin >> s;
for (int j=0; j<C; ++j) {
map[i][j] = s[j];
bool is_fire = false;
if (map[i][j] == 'J') {
start_y = i; start_x = j;
}
else if (map[i][j] == 'F') {
fire_map[i][j] = 0;
gq.push({i, j});
is_fire = true;
}
if (!is_fire) fire_map[i][j] = INT_MAX;
}
}
์์ ๊ฐ์ด ๋ถ์ ์์์ ์ ์ ์ญ์ผ๋ก ๊ด๋ฆฌํ๋ gq์ ๋ฃ์ด์ค๋ค.
is_fire ๋ผ๋ ํ๋๊ทธ๋ฅผ ํตํด fire๊ฐ ์๋ ๊ณณ๋ค์๋ INT_MAX๋ฅผ ํ ๋นํ๋ค.
์ด๋ fire๊ฐ ํผ์ง๋ ๊ณผ์ ์ bfs๋ก ํํํ ๋
๋ฐฉ๋ฌธํ์ง ์์์ ์ ๋ํ๋ด๋ ๊ฒฝ๊ณ๊ฐ์ผ๋ก์ ์์ฉํด์ค ๊ฒ์ด๋ค.
bool check_fire(int y, int x) {
return y>=0 && y<R && x>=0 && x<C && map[y][x] != '#';
}
void bfs_fire() {
while (!gq.empty()) {
int size = gq.size();
for (int s=0; s<size; ++s) {
auto info = gq.front(); gq.pop();
int y = info.y, x = info.x;
for (int i=0; i<4; ++i) {
int ny = y+dy[i], nx = x+dx[i];
if (check_fire(ny, nx) && (fire_map[ny][nx] > fire_map[y][x]+1)) {
fire_map[ny][nx] = fire_map[y][x]+1;
gq.push({ny, nx});
}
}
}
}
}
๋ถ์ด ํผ์ง๋ ๊ฒ์ ํ๋ฒ ํ์ ๋ค์ด์๋ fire๋ฅผ ๋ชจ๋ ๋น์์ผ ํ๋ค.
์ฆ, ํํ ํ๋ฏ์ด ์์์
for (int i=0; i<4; ++i) {
...
}
์ด๊ฒ๋ง ํด์๋ ์๋๋ค.
๋ฐ์์ ํ๋ฒ๋ loop๋ฅผ ๋ํํด์
๋๊ฐ์ ์๊ฐ๋์ ๋ด๊ฒผ๋ ๋ถ๋ค์ ๋ชจ๋ ์๋น๋๊ฒ๋ ํด์ผํ๋ค.
bool check(int y, int x, int ntime) {
return y>=0 && y<R && x>=0 && x<C && map[y][x] != '#' && !visited[y][x] && (ntime < fire_map[y][x]);
}
int bfs(int start_y, int start_x) {
visited[start_y][start_x] = true;
queue<Info> q; q.push({start_y, start_x, 0});
while (!q.empty()) {
auto info = q.front(); q.pop();
int y = info.y, x = info.x, time = info.time;
if (y == R-1 || x == C-1 || y == 0 || x == 0) return time+1;
for (int i=0; i<4; ++i) {
int ny = y+dy[i], nx = x+dx[i];
if (check(ny, nx, time+1)) {
visited[ny][nx] = true;
q.push({ny, nx, time+1});
}
}
}
return 0;
}
ํด๋น ์ขํ์ ๋๋ฌํ์๋ ๋ถ์ด ์ด๋์์ ์ ๋๋ฌํ๋์ง ์ ๋ณด๋ฅผ ๋ชจ๋ ์ ์ฅํ
fire_map ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์
์งํ์ด๋ฅผ ์ด๋์ํค๋ฉฐ bfs ๋๋ฆฌ๋ ๊ฒ์ ์ด์ ์ฌ์์ง๋ค.
์๋ฅผ๋ค์ด, ํ์ ๋ค์ด์๋ time์ 1์ ๋ํ ๊ฐ์ด
fire_map[ny][nx] ๋ณด๋ค ์๋ค๋ฉด
๋ถ์ด ํผ์ง๊ธฐ ์ ์ ๋๋ฌํ ๊ฒ์ด๋ฏ๋ก ๊ด์ฐฎ๋ค๋ ๋ป์ด๋ค.
2074. ๊ฑฐ๋ญ์ ๊ณฑ ๊ณ์ฐํ๊ธฐ
๊ฒฐ๊ตญ ํ์ง ๋ชปํ๋ค.
์์ด๋ก ๊ฒ์ํด๋ณธ ๊ฒฐ๊ณผ ๋ค์๊ณผ ๊ฐ์ ๊ธ๋ค์ ์ฐพ์ ์ ์์๋ค.
- https://blog.csdn.net/yalishiyanzhouyu888/article/details/52299122
- https://blog.csdn.net/kaisa158/article/details/46917325
p1, p2๊ฐ 20101, 97๋ก ์ค์ ํด์ bool hash[p1][p2]๋ก ์ค์ ํ๋ ๊ฒ๋ถํฐ
๊ทธ๋ฅ ์ดํด๊ฐ ๋์ง ์๋๋ค.
์ฌ์ง์ด boj์์ ๋ต๋ ํต๊ณผ๋์ง ์๋๋ค.
1325. ํจ์จ์ ์ธ ํดํน
vector<int> map[MAX];
...
for (int i=0; i<M; ++i) {
cin >> a >> b;
map[b].push_back(a); // b๋ฅผ ํดํนํ๋ฉด a๋ฅผ ํดํนํ ์ ์๋ค
}
๊ฒฐ๊ตญ์ a, b ์์๋ก ์
๋ ฅ์ด ๋ค์ด์ค์ง๋ง
b๋ฅผ ํดํนํ๋ฉด a๋ฅผ ํดํนํ ์ ์๋ค๋ ๋ง์ด๋ฏ๋ก ์์๋ฐ๊ฟ์ map์ ํธ์ํ๋ค.
bool visited[MAX];
int max_val = 0;
int dfs_val;
...
void dfs(int cur) {
for (int j=0; j<map[cur].size(); ++j) {
int next = map[cur][j];
if (!visited[next]) {
visited[next] = true;
++dfs_val;
dfs(next);
}
}
}
...
vector<int> ans;
for (int i=1; i<=N; ++i) {
if (map[i].empty()) continue;
memset(visited, false, sizeof(visited));
visited[i] = true;
dfs_val = 0;
dfs(i);
if (dfs_val > max_val) {
ans.clear();
ans.push_back(i);
max_val = dfs_val;
}
else if (dfs_val == max_val) {
ans.push_back(i);
}
}
์ผ๋ฐ์ ์ธ ํ๋ฆ์ด๋ค.
dfs_val ์ ํตํด ํดํนํ ์ ์๋ ์ปดํจํฐ์ ์๋ฅผ ์ผ๋ค.
์ด๊ฒ max_val ๋ณด๋ค ์ปธ๋ค๋ฉด ans ๋ฒกํฐ๋ฅผ ์ด๊ธฐํํ๊ณ ํธ์,
๊ฐ๋ค๋ฉด ๊ทธ๋ฅ ํธ์,
์๋ค๋ฉด ์๋ฌด๊ฒ๋ ํ์ง ์๋๋ค.