
1365๋ฒ: ๊ผฌ์ธ ์ ๊น์ค
์ฒซ ์ค์ ์ ๋ด๋์ ๊ฐ์ N(1 โค N โค 100,000)์ด ์ฃผ์ด์ง๊ณ , ์ด์ด์ N๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์๊ฐ N๊ฐ ์ฃผ์ด์ง๋ค. i๋ฒ์งธ ์ค์ ์ ๋ ฅ๋๋ ์์ฐ์๋ ๊ธธ ์ผ์ชฝ์ i๋ฒ์งธ ์ ๋ด๋์ ์ฐ๊ฒฐ๋ ๊ธธ ์ค๋ฅธํธ์ ์ ๋ด๋๊ฐ
www.acmicpc.net
์๋ ํ์ธ์.
๋ฐฑ์ค์ ๊ผฌ์ธ ์ ๊น์ค ๋ฌธ์ ์ ๋๋ค.
์ต์ฅ ์ฆ๊ฐ ์์ด์ ๊ธธ์ด๋ฅผ ์ฐ์ํ๊ฒ ๋๋ ค๋๋ ค ๋ฌผ์ด๋ณด๋ ๋ฌธ์ ์์.
์ด ๋ฌธ์ ๋ฅผ ํ ๋๋ง ํด๋ LIS์ ๊ธธ์ด ๊ตฌํ๋ ๋ฐฉ๋ฒ์ DP, ์ฆ O(N^2)์ธ ๋ฐฉ๋ฒ๋ง ์๊ณ ์์์ด์ 10๋ง...์ด๋ผ๋ ์ ๋ ฅ๊ฐ์ ๋ณด๊ณ ๋ญ๊ฐ ์ด์ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๊ณฑ์ ์ด ํท๊ฐ๋ ค์ ๊ณ์ฐ๊ธฐ๋ก 10๋ง*10๋ง์ ํด ๋ดค์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ชป ํธ๋ ๋ฌธ์ ๋ค ์ถ์ด ํธ๋ค๋ฅ ๊ตฌ๊ธ๋ง์ผ๋ก ์ ๋ต ํ์ด๋ฅผ ์ฐธ๊ณ ํด์ ํ์์ต๋๋ค.
๊ทผ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ์๊ณ ๋๋ ์ ๋ฒ ์ฌ์ด ๋ฌธ์ ์์ด์.
๊ตฌ๊ธ๋งํ์๋ ๋ถ๋ค๋ 10๋ง์ ๋ณด๊ณ ๋๋ผ์ ๋๋ง์น์ ๊ฒ ๋ถ๋ช ํด์. ๊ทธ๋ ์ฃ ?
๋ฌธ์ ์ค๋ช
๋ฌธ์
๊ณตํ๊ตญ์ ์๋ ์ ์คํ์ด ์์์๋ ๊ธธ์ ์ฌ์ด์ ๋๊ณ ์ ๋ด๋๊ฐ ์๋์ ๊ฐ์ด ๋ ์ค๋ก ๋์ด์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ธธ ์ผํธ๊ณผ ๊ธธ ์ค๋ฅธํธ์ ์ ๋ด๋๋ ํ๋์ ์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค. ์ด๋ค ์ ๋ด๋๋ ๋ ๊ฐ ์ด์์ ๋ค๋ฅธ ์ ๋ด๋์ ์ฐ๊ฒฐ๋์ด ์์ง๋ ์๋ค.

๋ฌธ์ ๋ ์ด ๋ ์ ๋ด๋ ์ฌ์ด์ ์๋ ์ ๊น์ค์ด ๋งค์ฐ ๊ผฌ์ฌ ์๋ค๋ ์ ์ด๋ค. ๊ผฌ์ฌ์๋ ์ ๊น์ค์ ํ์ฌ๋ฅผ ์ ๋ฐํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ์ ์คํ์ด ์์ ์์ฅ ์ํ์๋ ์ ๊ฒฉ์ ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ๋ก ํ๋ค.
์ํ์๋ ๊ผฌ์ฌ ์๋ ์ ๊น์ค ์ค ๋ช ๊ฐ๋ฅผ ์ ์ ํ ์๋ผ ๋ด์ด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ๋ก ํ๋ค. ํ์ง๋ง ์ด๋ฏธ ์ค์นํด ๋์ ์ ์ ์ด ์๊น๊ธฐ ๋๋ฌธ์ ์๋ผ๋ด๋ ์ ์ ์ ์ต์๋ก ํ์ฌ ๊ผฌ์ฌ ์๋ ์ ์ ์ด ํ๋๋ ์๊ฒ ๋ง๋ค๋ ค๊ณ ํ๋ค.
์ ์คํ์ด ์์ ์์ฅ ์ํ์๋ฅผ ๋์ ์๋ผ๋ด์ผ ํ ์ ์ ์ ์ต์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ ์ค์ ์ ๋ด๋์ ๊ฐ์ N(1 โค N โค 100,000)์ด ์ฃผ์ด์ง๊ณ , ์ด์ด์ N๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์๊ฐ N๊ฐ ์ฃผ์ด์ง๋ค. i๋ฒ์งธ ์ค์ ์ ๋ ฅ๋๋ ์์ฐ์๋ ๊ธธ ์ผ์ชฝ์ i๋ฒ์งธ ์ ๋ด๋์ ์ฐ๊ฒฐ๋ ๊ธธ ์ค๋ฅธํธ์ ์ ๋ด๋๊ฐ ๋ช ๋ฒ ์ ๋ด๋์ธ์ง๋ฅผ ๋ํ๋ธ๋ค.
์ถ๋ ฅ
์ ์ ์ด ๊ผฌ์ด์ง ์์ผ๋ ค๋ฉด ์ต์ ๋ช ๊ฐ์ ์ ์ ์ ์๋ผ๋ด์ผ ํ๋ ์ง๋ฅผ ์ฒซ์งธ ์ค์ ์ถ๋ ฅํ๋ค.
๋ฌธ์ ํ์ด ๋ฐฉ๋ฒ
๊ผฌ์ธ ์ ๊น์ค์ ํ๊ธฐ ์ํด์๋ ๋ฐ๋ํธ ์ ๋ด๋์ ์ฐจ๋ก๋๋ก ์ ์ ์ ์ฐ๊ฒฐํด์ผ ํ๋๋ฐ์.
์ค๊ฐ์ ์์๊ฐ ๊ผฌ์ด๋ฉด ์ ๋๋ค๋ ๋ป์ ๋๋ค.
1, 2, 3, 4, 7, 6, 5...
์ด๋ ๊ฒ ์ ์ ์ด ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด 7๋ฒ๊ณผ 6๋ฒ ์ ๋ด๋์ ์ฐ๊ฒฐ๋์ด ์๋ ์ ์ ์ ์๋ผ์ค์ผ ํฉ๋๋ค.
์ฌ๊ธฐ์ ๋์น๋ฅผ ์ฑ์ จ๊ฒ ์ง๋ง 7๋ฒ๊ณผ 6๋ฒ์ ์๋ฅด๋ฉด 1, 2, 3, 4, 5๊ฐ ๋จ์ฃ .
์ฆ ์ฆ๊ฐ ์์ด์ ๊ตฌํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
์ต์๋ก ์ ์ ์ ์๋ผ์ค์ผ ํ๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ ์์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํด์ฃผ๊ณ , ์ ์ฒด ์ ๋ด๋ ์์์ ์์ด์ ๊ธธ์ด๋ฅผ ๋นผ๋ฉด ์๋ผ์ผ ํ๋ ์ ์ ์ ๊ฐฏ์๊ฐ ๋์ค๊ฒ ๋๊ฒ ์ฃ .
๊ทธ๋ ๋ค๊ณ ์ด ์ฐจ๋ก๋๋ก๊ฐ ๋ด๋ฆผ์ฐจ์์ด์ด๋ ๋๋๋?
๊ทธ๊ฑด ์๋๋๋ค.
4, 3, 2, 1๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ 4, 3, 2 ์ ๋ถ๋ฅผ ์๋ผ์ค์ผ ํฉ๋๋ค.
๋จ๋ ์ ์ ์ ๋จ 1๊ฐ๋ฐ์ ์์ต๋๋ค.
2๊ฐ ์ด์์ ์ ์ ์ด ๋จ๋ ์๊ฐ ๋ฐ๋์ ๊ผฌ์ด๊ฒ ๋๊ธฐ ๋๋ฌธ์ด์์.
๊ฐ๋จํ ๋งํ์๋ฉด LIS์ ๊ธธ์ด๋ฅผ ๊ตฌํด์ผ ํ๋๋ฐ, ์ ๋ ฅ๊ฐ์ด 10๋ง์ด๋ฏ๋ก O(NlogN)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ์ด๋ถํ์์ ์ฌ์ฉํด์ ํจ์จ์ฑ์ ๊ฐ์ ํด์ผ ํฉ๋๋ค.
LIS๋ฅผ ์ผ๋ฌด์ง๊ฒ ๊ณต๋ถํ ์ ์ด ์์ด์ ์ด์ฐธ์ ์ด์ ๋ฆฌ๋ฅผ ํ๋๋ฐ ํ๋ค ๋ณด๋ ๋ฐฐ๋ณด๋ค ๋ฐฐ๊ผฝ์ด ์ปค์ ธ์ ๋ฐ๋ก ์ ๋ฆฌ๊ธ์ ์์ฑํด์ผ๊ฒ ๋๋ผ๊ณ ์.
์๋์ ๋งํฌ ์ฒจ๋ถํด ๋๊ฒ ์ต๋๋ค.
์ ๋ต ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
์ ๋ต
package gold2
fun main() = with(System.`in`.bufferedReader()) {
var N = readLine().toInt()
var arr = readLine().split(" ").map { it.toInt() }.toIntArray()
var lis = IntArray(N + 1)
fun lowerBound(num: Int, left: Int, right: Int): Int {
var l = left
var r = right
while (l < r) {
var mid = (l + r) / 2
if (lis[mid] < num) l = mid + 1
else r = mid
}
return r
}
var idx = 0
for (i in 0 until N) {
if (idx == 0) lis[idx++] = arr[i]
else {
if (lis[idx - 1] < arr[i]) lis[idx++] = arr[i]
else {
lis[lowerBound(arr[i], 0, idx)] = arr[i]
}
}
}
println(N - idx)
}
'๐ ๊ณต๋ถ > ๐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ Kotlin ํ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค ํํ์ - boj2932 (0) | 2023.07.11 |
---|---|
๋ฐฑ์ค N๊ณผ M (9) - boj15663 (1) | 2023.04.24 |
ํ๋ก๊ทธ๋๋จธ์ค - Lv2. ํ๋ณดํค Kotlin (0) | 2023.04.08 |
์ฒซ ๊ธ (0) | 2023.04.07 |

1365๋ฒ: ๊ผฌ์ธ ์ ๊น์ค
์ฒซ ์ค์ ์ ๋ด๋์ ๊ฐ์ N(1 โค N โค 100,000)์ด ์ฃผ์ด์ง๊ณ , ์ด์ด์ N๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์๊ฐ N๊ฐ ์ฃผ์ด์ง๋ค. i๋ฒ์งธ ์ค์ ์ ๋ ฅ๋๋ ์์ฐ์๋ ๊ธธ ์ผ์ชฝ์ i๋ฒ์งธ ์ ๋ด๋์ ์ฐ๊ฒฐ๋ ๊ธธ ์ค๋ฅธํธ์ ์ ๋ด๋๊ฐ
www.acmicpc.net
์๋ ํ์ธ์.
๋ฐฑ์ค์ ๊ผฌ์ธ ์ ๊น์ค ๋ฌธ์ ์ ๋๋ค.
์ต์ฅ ์ฆ๊ฐ ์์ด์ ๊ธธ์ด๋ฅผ ์ฐ์ํ๊ฒ ๋๋ ค๋๋ ค ๋ฌผ์ด๋ณด๋ ๋ฌธ์ ์์.
์ด ๋ฌธ์ ๋ฅผ ํ ๋๋ง ํด๋ LIS์ ๊ธธ์ด ๊ตฌํ๋ ๋ฐฉ๋ฒ์ DP, ์ฆ O(N^2)์ธ ๋ฐฉ๋ฒ๋ง ์๊ณ ์์์ด์ 10๋ง...์ด๋ผ๋ ์ ๋ ฅ๊ฐ์ ๋ณด๊ณ ๋ญ๊ฐ ์ด์ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๊ณฑ์ ์ด ํท๊ฐ๋ ค์ ๊ณ์ฐ๊ธฐ๋ก 10๋ง*10๋ง์ ํด ๋ดค์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ชป ํธ๋ ๋ฌธ์ ๋ค ์ถ์ด ํธ๋ค๋ฅ ๊ตฌ๊ธ๋ง์ผ๋ก ์ ๋ต ํ์ด๋ฅผ ์ฐธ๊ณ ํด์ ํ์์ต๋๋ค.
๊ทผ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ์๊ณ ๋๋ ์ ๋ฒ ์ฌ์ด ๋ฌธ์ ์์ด์.
๊ตฌ๊ธ๋งํ์๋ ๋ถ๋ค๋ 10๋ง์ ๋ณด๊ณ ๋๋ผ์ ๋๋ง์น์ ๊ฒ ๋ถ๋ช ํด์. ๊ทธ๋ ์ฃ ?
๋ฌธ์ ์ค๋ช
๋ฌธ์
๊ณตํ๊ตญ์ ์๋ ์ ์คํ์ด ์์์๋ ๊ธธ์ ์ฌ์ด์ ๋๊ณ ์ ๋ด๋๊ฐ ์๋์ ๊ฐ์ด ๋ ์ค๋ก ๋์ด์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ธธ ์ผํธ๊ณผ ๊ธธ ์ค๋ฅธํธ์ ์ ๋ด๋๋ ํ๋์ ์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค. ์ด๋ค ์ ๋ด๋๋ ๋ ๊ฐ ์ด์์ ๋ค๋ฅธ ์ ๋ด๋์ ์ฐ๊ฒฐ๋์ด ์์ง๋ ์๋ค.

๋ฌธ์ ๋ ์ด ๋ ์ ๋ด๋ ์ฌ์ด์ ์๋ ์ ๊น์ค์ด ๋งค์ฐ ๊ผฌ์ฌ ์๋ค๋ ์ ์ด๋ค. ๊ผฌ์ฌ์๋ ์ ๊น์ค์ ํ์ฌ๋ฅผ ์ ๋ฐํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ์ ์คํ์ด ์์ ์์ฅ ์ํ์๋ ์ ๊ฒฉ์ ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ๋ก ํ๋ค.
์ํ์๋ ๊ผฌ์ฌ ์๋ ์ ๊น์ค ์ค ๋ช ๊ฐ๋ฅผ ์ ์ ํ ์๋ผ ๋ด์ด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ๋ก ํ๋ค. ํ์ง๋ง ์ด๋ฏธ ์ค์นํด ๋์ ์ ์ ์ด ์๊น๊ธฐ ๋๋ฌธ์ ์๋ผ๋ด๋ ์ ์ ์ ์ต์๋ก ํ์ฌ ๊ผฌ์ฌ ์๋ ์ ์ ์ด ํ๋๋ ์๊ฒ ๋ง๋ค๋ ค๊ณ ํ๋ค.
์ ์คํ์ด ์์ ์์ฅ ์ํ์๋ฅผ ๋์ ์๋ผ๋ด์ผ ํ ์ ์ ์ ์ต์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ ์ค์ ์ ๋ด๋์ ๊ฐ์ N(1 โค N โค 100,000)์ด ์ฃผ์ด์ง๊ณ , ์ด์ด์ N๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์๊ฐ N๊ฐ ์ฃผ์ด์ง๋ค. i๋ฒ์งธ ์ค์ ์ ๋ ฅ๋๋ ์์ฐ์๋ ๊ธธ ์ผ์ชฝ์ i๋ฒ์งธ ์ ๋ด๋์ ์ฐ๊ฒฐ๋ ๊ธธ ์ค๋ฅธํธ์ ์ ๋ด๋๊ฐ ๋ช ๋ฒ ์ ๋ด๋์ธ์ง๋ฅผ ๋ํ๋ธ๋ค.
์ถ๋ ฅ
์ ์ ์ด ๊ผฌ์ด์ง ์์ผ๋ ค๋ฉด ์ต์ ๋ช ๊ฐ์ ์ ์ ์ ์๋ผ๋ด์ผ ํ๋ ์ง๋ฅผ ์ฒซ์งธ ์ค์ ์ถ๋ ฅํ๋ค.
๋ฌธ์ ํ์ด ๋ฐฉ๋ฒ
๊ผฌ์ธ ์ ๊น์ค์ ํ๊ธฐ ์ํด์๋ ๋ฐ๋ํธ ์ ๋ด๋์ ์ฐจ๋ก๋๋ก ์ ์ ์ ์ฐ๊ฒฐํด์ผ ํ๋๋ฐ์.
์ค๊ฐ์ ์์๊ฐ ๊ผฌ์ด๋ฉด ์ ๋๋ค๋ ๋ป์ ๋๋ค.
1, 2, 3, 4, 7, 6, 5...
์ด๋ ๊ฒ ์ ์ ์ด ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด 7๋ฒ๊ณผ 6๋ฒ ์ ๋ด๋์ ์ฐ๊ฒฐ๋์ด ์๋ ์ ์ ์ ์๋ผ์ค์ผ ํฉ๋๋ค.
์ฌ๊ธฐ์ ๋์น๋ฅผ ์ฑ์ จ๊ฒ ์ง๋ง 7๋ฒ๊ณผ 6๋ฒ์ ์๋ฅด๋ฉด 1, 2, 3, 4, 5๊ฐ ๋จ์ฃ .
์ฆ ์ฆ๊ฐ ์์ด์ ๊ตฌํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
์ต์๋ก ์ ์ ์ ์๋ผ์ค์ผ ํ๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ ์์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํด์ฃผ๊ณ , ์ ์ฒด ์ ๋ด๋ ์์์ ์์ด์ ๊ธธ์ด๋ฅผ ๋นผ๋ฉด ์๋ผ์ผ ํ๋ ์ ์ ์ ๊ฐฏ์๊ฐ ๋์ค๊ฒ ๋๊ฒ ์ฃ .
๊ทธ๋ ๋ค๊ณ ์ด ์ฐจ๋ก๋๋ก๊ฐ ๋ด๋ฆผ์ฐจ์์ด์ด๋ ๋๋๋?
๊ทธ๊ฑด ์๋๋๋ค.
4, 3, 2, 1๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ 4, 3, 2 ์ ๋ถ๋ฅผ ์๋ผ์ค์ผ ํฉ๋๋ค.
๋จ๋ ์ ์ ์ ๋จ 1๊ฐ๋ฐ์ ์์ต๋๋ค.
2๊ฐ ์ด์์ ์ ์ ์ด ๋จ๋ ์๊ฐ ๋ฐ๋์ ๊ผฌ์ด๊ฒ ๋๊ธฐ ๋๋ฌธ์ด์์.
๊ฐ๋จํ ๋งํ์๋ฉด LIS์ ๊ธธ์ด๋ฅผ ๊ตฌํด์ผ ํ๋๋ฐ, ์ ๋ ฅ๊ฐ์ด 10๋ง์ด๋ฏ๋ก O(NlogN)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ์ด๋ถํ์์ ์ฌ์ฉํด์ ํจ์จ์ฑ์ ๊ฐ์ ํด์ผ ํฉ๋๋ค.
LIS๋ฅผ ์ผ๋ฌด์ง๊ฒ ๊ณต๋ถํ ์ ์ด ์์ด์ ์ด์ฐธ์ ์ด์ ๋ฆฌ๋ฅผ ํ๋๋ฐ ํ๋ค ๋ณด๋ ๋ฐฐ๋ณด๋ค ๋ฐฐ๊ผฝ์ด ์ปค์ ธ์ ๋ฐ๋ก ์ ๋ฆฌ๊ธ์ ์์ฑํด์ผ๊ฒ ๋๋ผ๊ณ ์.
์๋์ ๋งํฌ ์ฒจ๋ถํด ๋๊ฒ ์ต๋๋ค.
์ ๋ต ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
์ ๋ต
package gold2
fun main() = with(System.`in`.bufferedReader()) {
var N = readLine().toInt()
var arr = readLine().split(" ").map { it.toInt() }.toIntArray()
var lis = IntArray(N + 1)
fun lowerBound(num: Int, left: Int, right: Int): Int {
var l = left
var r = right
while (l < r) {
var mid = (l + r) / 2
if (lis[mid] < num) l = mid + 1
else r = mid
}
return r
}
var idx = 0
for (i in 0 until N) {
if (idx == 0) lis[idx++] = arr[i]
else {
if (lis[idx - 1] < arr[i]) lis[idx++] = arr[i]
else {
lis[lowerBound(arr[i], 0, idx)] = arr[i]
}
}
}
println(N - idx)
}
'๐ ๊ณต๋ถ > ๐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ Kotlin ํ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค ํํ์ - boj2932 (0) | 2023.07.11 |
---|---|
๋ฐฑ์ค N๊ณผ M (9) - boj15663 (1) | 2023.04.24 |
ํ๋ก๊ทธ๋๋จธ์ค - Lv2. ํ๋ณดํค Kotlin (0) | 2023.04.08 |
์ฒซ ๊ธ (0) | 2023.04.07 |