๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(BOJ)์์ ์ ๊ณต ๋๋ 12015๋ฒ ๋ฌธ์ ๋ ์ ํ ๋ฌธ์ ๊ฐ ์๋ค.
๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด
๋๋ ์ ๋ฌธ์ ๋ฅผ ๋จผ์ ํ์ด๋ณด๊ณ ์ค๋ ๊ฒ์ ์ถ์ฒํ๋ค.
ํด๋น ๋ฌธ์ ๋ ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด(LIS, Longest Increasing Subsequence)๋ก ์ ๋ช ํ ๋ฌธ์ ์ด๋ค.
๋ฌธ์
์์ด A๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์๋ฅผ ๋ค์ด, ์์ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์ฐ์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ A = {10, 20, 10, 30, 20, 50} ์ด๊ณ , ๊ธธ์ด๋ 4์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์์ด A์ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000,000)์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค์๋ ์์ด A๋ฅผ ์ด๋ฃจ๊ณ ์๋ Ai๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ Ai ≤ 1,000,000)
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์์ด A์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
ํ์ด
์์ ๊ฐ์ ์ ๋ณด๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํ๋ค.
์ฐ๋ฆฌ๋, ๋ฌธ์ ์ ์์ ๋๋ฌธ์ {10, 20, 10, 30, 20, 50}์ด๋ผ๋ ์์ด์ ์ต์ฅ ๊ธธ์ด๋ฅผ ์ ์ ์๋ค.
ํด๋น ๋ฌธ์ ๋ 1 <= N <= 100๋ง์ด๋ฏ๋ก O(1) ~ O(NlogN)์ ํด๊ฒฐํด์ผํ๋ ๋ฌธ์ ์์ ์์ธกํ ์ ์๋ค.
Naive ํ๊ฒ ์ ๊ทผํ๊ธฐ
1. ์ง๊ด์ ์ผ๋ก ๋ณด๊ธฐ
1. 10, 20์ด ๋ง๋ค์ด์ง
2. 10์ ๋ถ์ฌ๋ดค์ ์งง์ผ๋๊น ๋ถ์ด์ง ์์.
3. 10, 20, 30์ด ๋ง๋ค์ด์ง
4. 20์ ๋ถ์ฌ๋ดค์ ์งง์ผ๋๊น ๋ถ์ด์ง ์์
5. 10, 20, 30, 50์ด ๋ง๋ค์ด์ง
์ ๋ง ๋ณด์ด๋๋๋ก๋ง ์ ๊ทผํ๋ฉด ์์๊ฐ์ ๊ณผ์ ์ด ๋ฐ์ํ๋ค.
๊ณผ์ฐ, ์ ๋ต์ผ๊น?
์ฐ๋ฆฌ๋ ์ฃผ์ด์ง ์์ด์์ {10, 20, 10, 30, 20, 50} ์์น ๋ ๊ฐ ๋๋ฌธ์ ์์ ์ฌ์ด์ ์ด๋ค ๊ฐ์ด ์์์ง ๋ชจ๋ฅธ๋ค.
{10, 20, 11, 12, 15, 30, 20, 50} ํด๋น ์์ด์์ ์ ํ์ด๊ฐ ์ฑ๋ฆฝ๋์ง ์์์ ์ ์ ์๋ค.
๊ทธ๋ผ, ์ด๋ป๊ฒ ์ ๊ทผํด์ผํ ๊น?
์์๋๋ก ์ ์ฅ์ ์๊ฐํด๋ณด๋ฉด ๋๋ค. ์ด ๋ง์ด ๋ฌด์จ ๋ป์ด๋๋ฉด,
{10, 20, 11, 12, 15, 30, 20, 50} ๋ค์๊ณผ ๊ฐ์ ์์ด์์
- 0๋ฒ ์งธ index : 10, ๋งจ ์์ด๋ฏ๋ก ์์ด์ ์ต์ฅ ๊ธธ์ด๋ 1์ ๊ฐ๊ฒ ๋๋ค.
- 1๋ฒ ์งธ index : 20, ๋ด ์์ ๋๋ณด๋ค ์์ ์์๋ฅผ ์ฐพ๋๋ค.
- 0๋ฒ ์งธ index์ธ 10, 10์ ๊ธธ์ด = 1
- 1๋ฒ ์งธ index์ธ 20์ ๊ธธ์ด๋ ๋๋ณด๋ค ์์ ์์์ ์ด์ด์ง๋ ์์ด์ด๋ฏ๋ก 10์ ๊ธธ์ด + 1๋ก ์ ๋ฐ์ดํธํ๋ค.
- 2๋ฒ ์งธ index : 11, ๋ด ์์ ๋๋ณด๋ค ์์ ์์๋ฅผ ์ฐพ๋๋ค.
- 1๋ฒ ์งธ index์ธ 20, ๋๋ณด๋ค ํผ
- 0๋ฒ ์งธ index์ธ 10, ๋๋ณด๋ค ์์
- 0๋ฒ ์งธ index๊น์ง์ ๊ธธ์ด + 1๋ก ๋ด ๊ธธ์ด๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
ํด๋น ๋ฌธ์ ๋ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์์ ์ ์ ์๋ค.์ด์ ๊ฐ์ ๊ธฐ๋ก์ ์ด์ฉํด ํ์ฌ ๋ด ๊ธฐ๋ก์ ์ ๋ฐ์ดํธ ํ๋ ๋ฉ๋ชจ์ ์ด์ ๊ธฐ๋ฒ์ด ๋ค์ด๊ฐ๋ค.
์๊ฐ ๋ณต์ก๋๋?
ํ์ด๋ฅผ ์๊ฐํ๋ค๋ฉด, BOJ์ ๊ฐ์ ์จ๋ผ์ธ ์ ธ์ง์์๋ ๊ทธ๋ฅ ๋ ๋ค ์ ์ถํด๋ด๋ ๋ฌด๊ดํ๋ค.
ํ์ง๋ง, ์ฝ๋ฉํ ์คํธ๋ ์๊ณ ๋ฆฌ์ฆ ๋ํ๋ฅผ ์๊ฐํ๋ค๋ฉด ์ ๋ต์ด ์ณ์์ง ๊ฒ์ฆ์ ํด๋ด์ผํ๋ค.
์ฐ๋ฆฌ๋ ์ ํ์ด๊ฐ ์ ๋ต์ด ๋์ฌ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋๋ค.
๊ทธ๋ผ ์๊ฐ ์์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋์ง ์๊ฐ ๋ณต์ก๋๋ฅผ ํ ๋ฒ ๊ณ์ฐํด๋ด์ผ ํ๋๋ฐ,
ํ์ฌ ์ธ๋ฑ์ค์ผ ๋, ์ด์ ์ธ๋ฑ์ค ์ค์์ ๋๋ณด๋ค ์์ ๊ฐ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
๋ง์ฝ์ ์์ด์ด ๋ด๋ฆผ์ฐจ์ {5, 4, 3, 2, 1}๋ก ๋์ด ์๋ค๋ฉด?
์ ๋ต์ 1์ด์ง๋ง ์ต์ ์ ๊ฒฝ์ฐ, O(N^2)์ ์๊ฐํด ๋ณผ ์ ์๋ค.
N๊ฐ์ ๋ํด์ N-1๋ฒ๊น์ง ํ์์ ํด์ผํ๋ฏ๋ก N * (N-1)์ ์๊ฐ ๋ณต์ก๋๊ฐ ๋ฐ์ํ๋ค.
๋ฌธ์ ์์ ์ฐ๋ฆฌ๊ฐ ์ ๋ ฅ๋ฐ๋ N์ ๋ฐ์ดํฐ๋ 100๋ง๊ฐ์ด๋ค.
100๋ง * (100๋ง - 1), ์ฃผ์ด์ง ์ ํ ์๊ฐ์ 1์ด์ธ๋ฐ ํฐ๋ฌด๋ ์๋ค ใ ใ ใ
์ข ๋ ํจ์จ์ ์ธ ์ ๊ทผ์ ํ๊ธฐ
์ข ๋, ํจ์จ์ ์ธ ์ ๊ทผ์ ํ๋ค๋๊ฒ ๋ง๋ง ์ฝ์ง. ๊ทธ๊ฒ์ ์ ์ฉํ๋ ๊ฒ์ด ๋ฌด์ฒ ํ๋ค๋ค๋ ๊ฒ์ ์๋ค.
Dynamic Programming ์ ์ธ ์ ๊ทผ์ด ์ฑ๊ณตํ๋ค๋ฉด ์ข ๋ ํจ์จ์ ์ธ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
{10, 20, 11, 30} ์ด ์๋ค๊ณ ํ ๋, ์ฐ๋ฆฌ๋ {10, 20, 30}์ ์ ํํ ์ ์์ง๋ง {10, 11, 30}๋ ์ ํํ ์ ์๋ค.
์ด ๋ด์ฉ์ ๋ณด๊ณ {10, 20, 11, 12, 15, 30, 20, 50} ์ด ์์ด์ ๋ณธ๋ค๋ฉด ์ด๋ป๊ฒ ํด๊ฒฐํ ์ง ๋ ์ฌ๋ ค์ผ ํ๋ค.
ํ์ฌ ์์์ ๋ํด์ ์ด์ ์์๊น์ง ๊ฐ์ ๊ธธ์ด์ ์์ด ์งํฉ์ด ์ฌ๋ฌ๊ฐ๊ฐ ์๋ค๋ฉด?
{10, 20, 11, 12, 30} ์ ๋ณด์
๊ธธ์ด๊ฐ 1์ผ ๋, {10}
๊ธธ์ด๊ฐ 2์ผ ๋, {10, 20}, {10, 11}
๊ธธ์ด๊ฐ 3์ผ ๋, {10, 20, 30}, {10, 11, 12}, {10, 11, 30}, {11, 12, 30}
...
์ด๋ฐ ์์ผ๋ก ๋์ด๋๋ค.
์ด์ฐจํผ ๊ฐ์ ๊ธธ์ด๋ผ๋ฉด ๋ ์์์๋ฅผ ์ ํํ๋ ๊ฒ์ด ๋ซ์ง ์์๊น?
์ฐ๋ฆฌ๋ ์ด๋ฐ ์๊ฐ์์ ์ด ๋ฌธ์ ๋ฅผ ์ ๊ทผํด์ผํ๋ค.
๊ทธ๋ผ ๋ ๋ค๋ฅธ ๋ฐ๋ก๋ฅผ ๋ค์ด๋ณด์.
{10, 20, 11, 12, 15, 30, 13, 20, 25, 50} ์ผ ๋,
์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒฐ๊ณผ ๋๋ก๋ฉด 6๋ฒ์งธ ์ธ๋ฑ์ค์ ๊ฐ์ธ '13'์ ๋ํด์ ์ฒ๋ฆฌ ํ ๋,
5๋ฒ์งธ ์ธ๋ฑ์ค๊น์ง ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ๋ {10, 11, 12, 15, 30}๋ฅผ ๋ง์กฑํ๊ฒ ๋๋ค๋ ๊ฒ์ด๋ค.
์ด์ '13'๋ณด๋ค ์์ ๋ ์์ ์ฐพ์์ ๋ค์ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ผ {10, 11, 12, 13}์ ๊ตฌํ ์ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ด๊ฒ์ ๊ธธ์ด๋ 4์ด๊ณ 5๋ฒ์งธ ์ธ๋ฑ์ค๊น์ง ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ์์ ๊ธธ์ด๊ฐ 4์ธ ์์ด์ {10, 11, 12, 15}์ด๋ค.
{10, 11, 12, 13}์ด ๋ ์์ ๊ฐ์ด๋ฏ๋ก ์ ํํ๊ฒ๋๋ค๋ฉด ๊ฒฐ๊ณผ๋ {10, 11, 12, 13, 30}์ด ๋๋ ๊ฒ์ด๋ค.
์ด ? ๊ทผ๋ฐ 13์ 30๋ณด๋ค ๋ค์ ์๋๋ฐ?
์ด๋ฐ ์๊ฐ์ด ๋ ๋ค๋ฉด ์ ์์ด๋ค.
์ฐ๋ฆฌ๋ ์ต์ฅ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ง๊ธ 4๋ฒ์งธ์ 13์ธ์ง 15์ธ์ง ์ ํ์๊ฐ ์๋ค.
๊ทธ๋ฅ 30๋ณด๋ค ์์์๋ก ์ด๋ฃจ์ด์ง LIS์ ๊ธธ์ด๊ฐ 4๋ผ๋ ๊ฒ์ ์๊ณ ์๋ค.
์ฐ๋ฆฌ๋ ๊ธธ์ด๋ง ์๋ฉด ๋๋๊น 30 ์์ 13์ด ์๋, 15๊ฐ ์๋ 30๋ณด๋ค ์์ ์๋๊น ๋ง์กฑํ๋ค๋ ๊ฒ์ด๋ค.
์ด๊ฒ ๋ ํท๊ฐ๋ฆด ์ ์์ผ๋ {10, 20, 11, 12, 15, 30, 13, 20, 25, 50} ์ด ์์ด์ ๋ํด ์ด๋ฒ์๋ 20์ ์ ํํด๋ณด์.
7๋ฒ ์งธ ์ธ๋ฑ์ค์ ๊ฐ์ธ '20'์ ๋ํด์ 6๋ฒ์งธ ์ธ๋ฑ์ค ๊ฐ์ธ 30๊น์ง์ ๊ฒฐ๊ณผ๋ฅผ ์์์ผ ํ๋ค.
์ฐ๋ฆฌ๋ ์์ ๊ณผ์ ์์ {10, 11, 12, 13, 30}๋ผ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์๊ณ ์ด์ 20์ ๋ฃ์ด๋ณด์.
'20'๋ณด๋ค ์์ ์๋ก ๊ตฌ์ฑ๋ ์์ด์ {10, 11, 12, 13}์ด๊ณ ์ด์ด ๋ถ์ด๊ฒ ๋๋ค๋ฉด {10, 11, 12, 13, 20}์ด ๋๋ค.
์ด๊ฒ์ ๊ธธ์ด๋ 5์ด๊ณ ์ด์ ๊ฒฐ๊ณผ์์ ๊ธธ์ด๊ฐ 5์ธ ์์ด์ {10, 11, 12, 13, 30} ์ด๋ค.
์ฐ๋ฆฌ๋ ๋ ์์ ๊ฐ์ ์ ํํ๊ธฐ๋ก ํ์ผ๋ 7๋ฒ์งธ ์ธ๋ฑ์ค๊น์ง LIS ๊ธธ์ด๋ 5์ด๋ค.
์ด์ '25'๋ฅผ ์ ํํด๋ณด์.
{10, 11, 12, 13, 20} ์์ '25'๋ณด๋ค ์์ ์๋ก ์ด๋ฃจ์ด์ง ์์ด์ ์ฐพ๋๋ค๊ณ ํ๋ฉด ๊ทธ ์์ฒด์ด๋ค.
๋ค์ 25๋ง ์ถ๊ฐํด์ฃผ๋ฉด ๋ ๋ฟ์ด๊ฒ ๋จ. -> {10, 11, 12, 13, 20, 25}
๊ทธ๋ฐ๋ฐ ๋ง์ฝ, ์ด์ ๊ณผ์ ์์ {10, 11, 12, 13, 20}๊ณผ {10, 11, 12, 13, 30}์ ๊ธธ์ด๊ฐ ๊ฐ๋ค๋ ์ด์ ๋ก
{10, 11, 12, 13, 30}์ ์ ํํ๋ค๋ฉด?
์ฐ๋ฆฌ์ ๋ ผ๋ฆฌ๋๋ก๋ผ๋ฉด {10, 11, 12, 13, 25}๋ผ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ฒ ๋ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๋ ์ ๊ณผ์ ์์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ค ๊ตฌํด๋ดค๋ค.
๊ทธ๋ผ, ์ด์ ์ง์ ๋ฌธ์ ๋ฅผ ํ์ด๋ด์ผ ํ๋๋ฐ ์ด๋ป๊ฒ ํ ์ ์์๊น?
lower_bound
์ฐ๋ฆฌ๋ lower_bound๋ผ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
์๊ฐ์ ์ ํ์ ๊ฐ์ ธ๋ณด์.
์์ ์๊น์ง ์ ํํ๋ค๋ ๊ฒ์ ์์์๊ฐ ์๋ ์๋ฅผ ์ ํํ๋ฉด? ๊ทธ ์ด์ ๊น์ง๋ ๋ฌด์กฐ๊ฑด ์์ ์์ด๋ค.
๋ ผ๋ฆฌ์์ผ๋ก ํํํ๋ฉด key < x๊ฐ ์์ ์๊น์ง ์ ํ, ์ด ๋ฐ๋๋ key >= x
์ฆ, ํ์ฌ ์์ ๊ฐ ์ด์์ ๊ฐ์ ์ฐพ์ผ๋ฉด ๋๋ ๊ฒ์ด๋ค.
log N์ ๋น ๋ฅด๊ฒ ์ฐพ์์ฃผ๋ lower_bound๋ฅผ ์ฌ์ฉ!
lower_bound๋ง ์ด์ฉ
/*
authored by jihwankim
https://dev-dot.tistory.com
acm 12015
*/
#include <bits/stdc++.h>
using namespace std;
vector<int> input(int &n) {
cin >> n;
vector<int> arr(n);
for(int i = 0; i < n; i++) {
cin >> arr[i];
}
return arr;
}
int solve(vector<int> &arr) {
vector<int> lis;
for(int i = 0; i < arr.size(); i++) {
int key = arr[i];
int v = lower_bound(lis.begin(), lis.end(), key) - lis.begin();
if(v == lis.size()) {
lis.push_back(key);
} else {
lis[v] = key;
}
}
return lis.size();
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(NULL);
int n;
vector<int> arr = input(n);
cout << solve(arr);
return 0;
}
STL set์ ์ด์ฉ
๋ ๋ฌธ์ ๋ฅผ ํ ๋๋ set์ ์ฌ์ฉํด์ ํ๊ธดํ๋ค.
์๋ฆฌ๋ ๊ฐ์ผ๋ ์ด๋ค ์ฐจ์ด์ ๋ค์ด ์๋์ง ์์๋ณด๋ ๊ฒ๋ ์ข์๋ฏ!
๊ทธ๋ฆฌ๊ณ ์ด๋ค ๋ฐฉ์์ ์ฌ์ฉํ๋๊ฒ ๋ ์ข์์ง๋ ์๊ฐํด๋ณด๋ฉด ์ข์๋ฏ!
/*
authored by jihwankim
https://dev-dot.tistory.com
acm 12015
*/
#include <bits/stdc++.h>
using namespace std;
vector<int> input(int &n) {
cin >> n;
vector<int> arr(n);
for(int i = 0; i < n; i++) {
cin >> arr[i];
}
return arr;
}
int solve(vector<int> &arr) {
set<int> s;
for (int &now: arr) {
auto it = s.lower_bound(now);
if (it != s.end()) s.erase(it);
s.insert(now);
}
return s.size();
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(NULL);
int n;
vector<int> arr = input(n);
cout << solve(arr);
return 0;
}
์ฐธ๊ณ ํ ํฌ์คํธ
์์ง ๋ฏธ์์ฑ
๋ฌธ์
https://www.acmicpc.net/problem/12015
12015๋ฒ: ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 2
์ฒซ์งธ ์ค์ ์์ด A์ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์๋ ์์ด A๋ฅผ ์ด๋ฃจ๊ณ ์๋ Ai๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ Ai ≤ 1,000,000)
www.acmicpc.net
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค - [BOJ 22856] ํธ๋ฆฌ ์ํ (0) | 2024.07.08 |
---|---|
๋ฐฑ์ค - [BOJ 1865] ์ํ (0) | 2024.07.06 |
๋ฐฑ์ค - [BOJ 3085] ์ฌํ๊ฒ์ (0) | 2024.03.01 |
๋ฐฑ์ค - [BOJ 12094] A์ B (0) | 2024.02.29 |
๋ฐฑ์ค - [BOJ 2109] ์ํ๊ฐ์ฐ (4) | 2024.02.29 |