๐ ๋ฌธ์ ๋ชฉ๋ก
- [โโ] 15641 - SUPER SUPER BINARY SEARCH DELUXE 2.5: THE LEGEND OF THE GOLDEN MAZASSUMNIDA, EPISODE 2: THE MAZWAETL UNIVERSE, PART 2: THE PARALLEL UNIVERSE AND THE LOST MAZASSUMNIDA: GAME OF THE YEAR EDITION
- [๐ฅ3] 1654 - ๋์ ์๋ฅด๊ธฐ
- [๐ฅ5] 2467 - ์ฉ์ก
- [๐ฅ4] 2473 - ์ธ ์ฉ์ก
1. SUPER SUPER BINARY SEARCH DELUXE 2.5: THE LEGEND OF THE GOLDEN MAZASSUMNIDA, EPISODE 2: THE MAZWAETL UNIVERSE, PART 2: THE PARALLEL UNIVERSE AND THE LOST MAZASSUMNIDA: GAME OF THE YEAR EDITION
๊ตฌ๋ฐ๊ธฐ์ปต์ ๋ค์ด๋ง ๋ดค์ง ๋ฌธ์ ๋ฅผ ํ์ด(?)๋ณธ ๊ฑด ์ด๋ฒ์ด ์ฒ์์ด๋ค. (๋ฌธ์ ์ด๋ฆ๋ถํฐ๊ฐใ
ใ
๋ด๊ฐ ์ง์ ์ด๋ถํ์๊ธฐ๊ฐ ๋์ด ์ ๋ต๊ฐ์ ์ฐพ๋ ๋ฌธ์ . 1~100 ์ฌ์ด์ ์์ฐ์๋ฅผ ์จ์ ์ ์ถํ๋ฉด ์ ๋ต๋ณด๋ค ํฐ์ง ์์์ง ์ฑ์ ํ๋ก๊ทธ๋จ์ด ํผ์ผํฐ์ง๋ก ์๋ ค์ค๋ค.
์ฝ๋
1
๐๐ญ
2. ๋์ ์๋ฅด๊ธฐ
ํ์ด๋ณธ ์ ํ์ด๋ผ ํ์ด๋ ์๊ณ ์์์ผ๋ฏ๋ก ๋ฐ๋ก ๋์ด๊ฐ ์ค ์์๋๋ฐ ์ด์คํ๊ฒ ์๊ณ ์๋ ํ์ ํฌ์ธํฐ ์ด๋ ์ง์ ์ ์๋ชป ์ก๊ณ โฆ ์ค์ํ ๋ถ๋ถ๋ ๋นผ๋จน์ด๋ฒ๋ ค์ ํ์ฐธ ์จ๋ฆํ๋ ๋ฌธ์ ๋ค.
์ผ๋จ โ์ด๋ถํ์ ๋์=๋ง๋ค ์ ์๋ ๋์ ์ ์ต๋ ๊ธธ์ดโ๋ก ๋๊ณ ๊ทธ ๊ธธ์ด๋ก ์๋๋ค๊ณ ๊ฐ์ ํ์ ๋ ๋ง๋ค์ด์ง๋ ๊ฐ์๋ฅผ ์นด์ดํธํ๋ฉด์ left, right๋ก ๊ธธ์ด์ ๋ฒ์๋ฅผ ์ขํ๋๊ฐ๋ ๊ฒ๊น์ง๋ ์๊ฐํ๋ค.
๊ทธ๋ฐ๋ฐ left์ right๋ฅผ ์ฎ๊ธฐ๋ค๊ฐ ์ ๋ต์ ํฌํจ์ํค์ง ์๋ ๊ตฌ๊ฐ์ด ๋์ด๋ฒ๋ฆฌ๋ฉด mid๊ฐ์ด ๋ ์ด์ ์ ๋ต์ด ๋์ฌ ์ ์๊ฒ ๋๋ฏ๋ก, ๊ทธ๋ฌ๊ธฐ ์ ๊น์ง N๊ฐ ์ด์์ ๋ง๋ค ์ ์๋ ๊ธธ์ด์ ํํด ๊ทธ ๊ฐ์ ๋ฐ๋ก ์ ์ฅํ์ด์ผ ํ๋๋ฐ(*๊ผญ ์ด ๋ฐฉ๋ฒ๋ง ์๋๊ฑด ์๋์ง๋ง)
๊ทธ๊ฑธ ๋ฐ๋ก ์ ์ฅํ๋ ์๊ฐ์ ๋ชป ํ๊ณ ๊ทธ๋ฅ ๋ฐ๋ณต๋ฌธ์ด ์ข
๋ฃ๋ ํ mid๊ฐ์ ์ถ๋ ฅํ๋๋ก ํด๋ฒ๋ฆฐ ๊ฒ ๋๋ฌธ์ ์ ๋๊ฒ ์ฝ์ง์ ํ๋ค.
๊ฑฐ๊ธฐ๋ค ํฌ์ธํฐ๋ฅผ ์ฎ๊ธฐ๋ ์ง์ ๋ left๋ mid+1๋ก, right๋ mid๋ก ์ก์๋๊ณ ์์๊ณ โฆ
๊ทธ์์ค์ left, right์ ์ด๊ธฐ๊ฐ์ ์ดํฉ๊น์ง ๊ตฌํด๊ฐ๋ฉฐ ์ ๊ฒฝ์ผ๋๋ฐ left์ ๊ฒฝ์ฐ์ ์คํ๋ ค 0์ด ๋ ์๋ ์๋ ์์ด์ด์-_-; ์ธ๋ฐ์๋ ๊ฒ ๊ฐ์ ๊ทธ๋ฅ ๋ค๋ฅธ ํ์ด๋ค์ฒ๋ผ left=1, right=์ต๋ ๋์ ๊ธธ์ด๋ก ์ฌ์ค์ ํ๋ค.
๋์ด๋์ ๋นํด ์ ๋ต๋ฅ ์ด ์ข ๋ฎ๊ธฐ๋ ํ๋ค๋งโฆ ์ด์ ๋๋ฉด ์์ง ์๊ณ ์๋ค๊ณ ํ๊ธฐ๋ ์ด๋ ค์ด๋ฏํ๋ ๋ฌธ์ ๋ค์ ์ข๋ ํ์ด๋ด์ผ๊ฒ ๋ค.
์ฝ๋๊ฐ ๋๊ฐ์ง๋ฐ ์ฒซ๋ฒ์งธ ์ฝ๋๋ ๋ค๋ฅธ๋ถ๋ค๊ณผ ๋น์ทํ ํ์ด์ด๊ณ
๋๋ฒ์งธ ์ฝ๋๋ ์ฝ์งํ๋ ๊ณผ์ ์์ ์ฐพ์๋ธ๊ฑด๋ฐ, ๋ฐ๋ก ๊ธธ์ด๊ฐ์ ์ ์ฅํ์ง ์๊ณ ๋ต์ ๊ตฌํ ๊ฒฝ์ฐ์ด๋ค. ์ฐจ์ด์ ์ ๋ฐ๋ณต๋ฌธ ์กฐ๊ฑด๊ณผ ํฌ์ธํฐ ์ด๋์ง์ , mid๋ฅผ ๋ฐ์ฌ๋ฆผํ์ฌ ๊ณ์ฐํ๋ค๋ ์ ์ด๋ค.
์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<iostream>
using namespace std;
int main() {
int k, n;
int longest = 0, cnt = 0, res = 0;
int len[10001];
long long left, mid, right;
cin >> k >> n;
for (int i = 0; i < k; i++) {
cin >> len[i];
if (longest < len[i]) longest = len[i];
}
left = 1;
right = longest;
mid = 0;
while (left <= right) {
mid = (left + right) / 2;
cnt = 0;
for (int i = 0; i < k; i++) {
cnt += len[i] / mid;
}
if (cnt >= n) {
if (res < mid) res = mid;
left = mid + 1;
}
else right = mid - 1;
}
cout << res;
}
์ฝ๋ #2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<iostream>
using namespace std;
int main() {
int k, n;
int longest = 0, cnt = 0;
int len[10001];
long long left, mid, right;
cin >> k >> n;
for (int i = 0; i < k; i++) {
cin >> len[i];
if (longest < len[i]) longest = len[i];
}
left = 1;
right = longest;
mid = 0;
while (left < right) {
mid = (left + right + 1) / 2;
cnt = 0;
for (int i = 0; i < k; i++) {
cnt += len[i] / mid;
}
if (cnt < n) right = (left + right) / 2;
else left = mid;
}
cout << (left + right) / 2;
}
3. ์ฉ์ก
์ง์ง ๋ค ์ง๋๊ณ ์ธ๋ฐ์์ด ์๊ฐ์ ๋ญ๋นํ๋ค. ์ ๊ธฐ๋ ๋ฏผ๋งํ ์ ๋๋ฐใ
ใ
ใ
์ฉ์ก์ด๋ผ๋ ํค์๋ ๋๋ฌธ์ ์ ๋ง ์ด์ด์๋ ์์โฆ๐คฆ
์ํผ ์ด ๋ฌธ์ ๋ ํฌํฌ์ธํฐ ๋ฌธ์ ์ด๋ค. ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ค๋ ์ ์ ์ด์งํ์๊ณผ ๊ฐ์ง๋ง ์ด์งํ์์ ์ ๋ต ์ธ๋ฑ์ค๋ฅผ ํฅํด ๋ฒ์๋ฅผ ์ ๋ฐ์ฉ ์ขํ๊ฐ๋ ๊ฒ์ด๊ณ , ํฌํฌ์ธํฐ๋ ํ์นธ์ฉ ํ์ผ๋ฉด์ ๊ณ์ฐํ ๊ฐ ์ค ์ ๋ต ์กฐ๊ฑด์ ํด๋นํ๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์๋ด๋ ๊ฒ์ด๋ฏ๋ก ๋์ค์ ์ ๋ต์ด ๋์๋๋ผ๋ ๋ ํฌ์ธํฐ๊ฐ ๋๊น์ง ํ์ํ ๋๊น์ง ๊ณ์ํ๋ค.
๊ทธ๋ ๊ธฐ๋๋ฌธ์ ์ด์งํ์์ ์๊ฐ๋ณต์ก๋๋ O(logn)์ด๊ณ ํฌํฌ์ธํฐ์ ์๊ฐ๋ณต์ก๋๋ O(n)์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ฐํ ๋ง์ด์ง๋ง ์ด์งํ์์ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋์ด ์์ด์ผ ํ๋ค. ํฌํฌ์ธํฐ๋ ๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ ์ ๋ ฌ๋์ด์์ง ์์๋ ๋ฌด๋ฐฉํ๋ค.
์กฐ๊ธ ๋ค๋ฅธ ์ ํ์ ํฌํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์ธ ์๋ค์ ํฉ 2 ๋ฌธ์ ๋ฅผ ์ ์ ์ธ๊ธํ์๋ฉด,
์ฌ๊ธฐ์๋ ๋จผ์ ๋ ํฌ์ธํฐ๋ฅผ ๊ฐ์ ์์น(0๋ฒ์งธ)์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ํฌ์ธํฐ ์ฌ์ด์ ๊ตฌ๊ฐํฉ์ ๊ตฌํ๋๋ฐ, ๋ชจ๋ ๊ฐ์ด ์์ฐ์์ด๊ธฐ ๋๋ฌธ์ ๊ตฌ๊ฐ์ ํฌ๊ธฐ ์ฆ๊ฐ์ด ๊ณง ์ดํฉ์ ์ฆ๊ฐ์ด ๋๋ค.
๊ทธ๋์ ๋ง์ฝ ํฉ์ด ๊ธฐ์ค๊ฐ๋ณด๋ค ์์ผ๋ฉด ๊ตฌ๊ฐ ํฌ๊ธฐ๋ฅผ ํค์ฐ๊ธฐ ์ํด left๋ ๋
๋๊ณ right๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์นธ ๋ฐ๊ณ , ๊ธฐ์ค๊ฐ๋ณด๋ค ํฌ๋ฉด left๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์นธ ๋ฐ๊ณ right๋ ๋
๋๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋์ด์์ง ์์๋ ๋๋ค.
๋ฐ๋ฉด ์ด ์ฉ์ก ๋ฌธ์ ๋ ์ ์ํ์ผ๋ก ์ฃผ์ด์ง๋ ๋ฐ์ดํฐ์์ ๋ ํฌ์ธํฐ๋ง์ ํฉ์ ๋ณด๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ ๋ ฌ๋์ด ์์ง ์๋ค๋ฉด ์ด๋์ชฝ ํฌ์ธํฐ๋ฅผ ์ฎ๊ฒจ์ผํ ์ง ๊ฒฐ์ ํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
๋ฐ๋ผ์ ์ด ๋ฌธ์ ์์๋ ์์ ๋ฐ์ดํฐ๊ฐ ์ค๋ฆ์ฐจ์์ผ๋ก ์ฃผ์ด์ก์ผ๋ฉฐ ๋ ํฌ์ธํฐ์ ์์น๋ ์์ชฝ ๋์์๋ถํฐ ์์ํด ๋ ๊ฐ์ ํฉ์ด ์์๋ผ๋ฉด left๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก, ์์๋ผ๋ฉด right๋ฅผ ์ผ์ชฝ์ผ๋ก ์ด๋์์ผ ์ ๋๊ฐ ํฌ๊ธฐ๋ฅผ ์ค์ด๋๋ก ํ๋ค.
(์ฌ๋ด์ด์ง๋งโฆ ๋ณ์ ๋ค์ด๋ฐ์ด ์ข ๋ณ๋ก ๊ฒ๊ฐ๋ค.)
์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<iostream>
using namespace std;
int main() {
int n, val[100000], left, right, min_left, min_right, min_val;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> val[i];
}
left = 0;
min_left = 0;
right = n - 1;
min_right = n - 1;
min_val = INT32_MAX;
while (left < right) {
int total = val[left] + val[right];
if (abs(total) < abs(min_val)) {
min_left = left;
min_right = right;
min_val = total;
}
(total < 0) ? left++ : right--;
}
cout << val[min_left] << " " << val[min_right];
}
4. ์ธ ์ฉ์ก
ํต๊ณผ๋ ํ์ง๋ง ์ฒ์์ ์๋ชป ์๊ฐํ๋ ์ฝ๋์ ๋ฌธ์ ์ ์ ์ฐพ๋๋ฐ ์๊ฐ์ด ์ข ๊ฑธ๋ ธ๋ค.
์ฐ์ ์ ๋ฌธ์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๊ธฐ์๋ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋์ด ์์ด์ผ ํ๋๋ฐ ์ด ๋ฌธ์ ์์๋ ๋ฐ์ดํฐ๊ฐ ๋ฌด์์๋ก ์ฃผ์ด์ง๋ฏ๋ก ๋จผ์ algorithm ํค๋์ sort()๋ฅผ ์ฌ์ฉํด ์ ๋ ฌํด์ฃผ์๋ค.
๊ทธ๋ค์ ์ฒซ๋ฒ์งธ ํฌ์ธํฐ๋ฅผ 0๋ถํฐ n-3๊น์ง ๊ณ ์ ์ผ๋ก ์ ํด๋๊ณ , ๊ฐ ๊ฒฝ์ฐ์ ๋ํด
1
2
left์ ์ธ๋ฑ์ค = ์ฒซ๋ฒ์งธ ํฌ์ธํฐ์ ์ธ๋ฑ์ค+1
right์ ์ธ๋ฑ์ค = n-1
์์ ์์ํ์ฌ ์ธ ๊ฐ์ ํฉ์ ์ ๋๊ฐ์ด ์ต์๊ฐ ๋๋ ๋ ํฌ์ธํฐ ์์น๋ฅผ ๊ตฌํด์ ์ง๊ธ๊น์ง ๊ตฌํ๋ ์ต์๊ฐ๋ณด๋ค ์๋ค๋ฉด ๊ฐฑ์ ํ๋๋ก ํ๋ค.
๋ ํฌ์ธํฐ์ ์ด๋๋ฐฉ์์ ์ ๋ฌธ์ ๊ทธ๋๋ก์ด๊ณ ๊ฑฐ๊ธฐ์ ์ฒซ๋ฒ์งธ ๊ฐ๊น์ง ๋ํด์ ๊ฒฐ์ ํ๋ ๋ฐฉ์์ด๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ฒซ๋ฒ์งธ ํฌ์ธํฐ์ ๋ํ ์๊ฐ๋ณต์ก๋๊ฐ O(n), ๊ฐ๊ฐ์ ๊ฒฝ์ฐ์ ํฌํฌ์ธํฐ์ ๋ํ ์๊ฐ๋ณต์ก๋๊ฐ O(n)์ด๋ฏ๋ก ์ด ์๊ฐ๋ณต์ก๋๋ O(n^2^)์ด ๋๋ค.
์ฒ์์ ์๋ชป ์๊ฐํ๋ ์ฝ๋๋ ์ด๋ค ํ๋ฆ์ด์๋๋ฉด
๋ ํฌ์ธํฐ์ ๋ํด ์ธ ๊ฐ์ ํฉ์ ์ ๋๊ฐ์ด ์ต์๊ฐ ๋๋ ์ธ๋ฒ์งธ ํฌ์ธํฐ์ ์์น๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ๋๋ฉด์ ์ฐพ๋๋ก ํ ๊ฒ์ด์๋ค.(๋ฌผ๋ก ๋ ํฌ์ธํฐ๋ ์ ์ธํ๊ณ )
๊ทธ๋ฌ๋๊น ์ ๋ฐฉ๋ฒ์์๋ ์ฒซ๋ฒ์งธ ํฌ์ธํฐ๋ฅผ ํ์ํ๋ for๋ฌธ ๋ด์ ํฌํฌ์ธํฐ๋ฅผ ํ์ํ๋ while๋ฌธ์ ๋์๋ค๋ฉด ์ด ๋ฐฉ๋ฒ์ while๋ฌธ ๋ด์ for๋ฌธ์ ๋์๋ค๋ ๊ฑด๋ฐ,
์ด๋ ๊ฒ ํ๋ฉด ๋ ํฌ์ธํฐ์ ์ด๋ ์์๊ฐ ์ ๋ต์ ํฌํจ์ํค์ง ์๋ ์ชฝ์ผ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํด๋ฒ๋ฆฐ๋คโฆ
์ข ๋ ์์ธํ ์ค๋ช
ํ๊ณ ์ถ์๋ฐ, ์ค์ค๋ก ๋ฐ๋ก๋ฅผ ์ฐพ๊ธฐ๋ ์ฝ์ง ์์๋๋งํผ ์์ง์ ์์ ํ ์ดํดํ์ง ๋ชปํ์ฌ ์ผ๋จ์ ๋ฐฑ์ค์์ ์ฐพ์ ๋ฐ๋ก๋ผ๋ ๋จ๊ฒจ๋๋๋ค.
(์ถ์ฒ: https://www.acmicpc.net/board/view/62826)
1
2
3
4
5
6
์
๋ ฅ: 6
13 14 48 -5 18 -96
๋ต: -5 13 14
ํ๋ฆฐ ๋ต: -96 18 48
์๋๋ ํต๊ณผํ ์ฝ๋์ด๋ค.
์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, left, right, min_f, min_l, min_r, val[5000];
cin >> n;
for (int i = 0; i < n; i++) {
cin >> val[i];
}
sort(val, val + n);
min_f = val[0];
min_l = val[1];
min_r = val[n - 1];
for (int first = 0; first < n-2; first++) {
left = first + 1;
right = n - 1;
while (left < right) {
long long total = (long long)val[first]+val[left]+val[right];
if (abs(total) < abs((long long)min_f + min_l + min_r)) {
min_f = val[first];
min_l = val[left];
min_r = val[right];
}
(total < 0) ? left++ : right--;
}
}
cout << min_f << " " << min_l << " " << min_r;
}