์ ์์ญ(10000๋ฒ)
Platinum 4
#์๋ฃ ๊ตฌ์กฐ #์ ๋ ฌ #๊ธฐํํ #์คํ
https://www.acmicpc.net/problem/10000
๋ฌธ์ ๋ด์ฉ
๋ฌธ์ ์ ๊ทผ
์ฐ์ ๋ฌธ์ ์ดํด๋ถํฐ ํด๋ณด์.
๊ฐ๋จํ๋ค.
์์ x์ถ์ ๊ตฌ์ฑํ๊ณ ๋ ํ, ์์ญ์ ์ธ๋ฉด ๋๋ค. ์์ญ์ ๊ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ธ๋ฉด ๋๋ค.
์์ ์์ญ๊ณผ ์๋ผ๋ฆฌ ์ ํ๋ฉด์ ๋๋ ์์ญ๋ ์๊ฐํด์ผ ํ๊ณ , ์ ๋ฐ๊นฅ์ ์์ญ๋ ์ฒ๋ฆฌํด์ผ ํ๋ค.
์๋ผ๋ฆฌ ์ ํ๋ฉด์ ๋๋๊ฒ ๋๋ ์์ญ์ ๋๋๋ ๋ฐฉ๋ฒ์ ์๊ฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ ต๋ค.
์ด๊ธฐ ๊ตฌํ ์์ด๋์ด๋ฅผ ๋ ์ฌ๋ฆฌ๊ธฐ ์ํด ์๋์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด์ ๊ตฌํํ๋ค.
https://wonyoung2257.tistory.com/79
์ ์ฌ์ง์ ์ ๊ตฌ์กฐ๋ฅผ ๊ดํธ๋ก ํํํ๋ฉด (()())์ ๊ฐ์ ํํ๊ฐ ๋๋ค.
์ฌ์ง์ ๊ฒฝ์ฐ์๋ ์์ด ๋ชจ๋ ์ ํด ์์ง๋ง ์์ด ์ ํด์์ง ์๋ ๊ฒฝ์ฐ๋ ๋ฐ๋ก ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
์์ด ์ ํ๋์ง ํ์ ํ๋ ๋ฐฉ๋ฒ์ ์ด์ ์๊ณผ ์ขํ๊ฐ ๋์ผํ๋ฉด ๋ ์์ด ์ ํด์๋ค๋ ๋ป์ด๋ค.
์์ด ์ ํด์์ง ์์ ๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์์ด ์ ํด์์ง ์์์ ์์ญ์ด ๋๋์ง ์๋๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ฌ๋ฉด ๋ก์ง์ ์ด๋ป๊ฒ ๊ตฌํํด์ผ ํ ๊น?
1. ์์ ์ขํ๋ฅผ ๋ด์ ๋ฆฌ์คํธ ์์ฑ
์์ ์ขํ ์ ๋ณด๋ฅผ ๋ด๋ ๋ฆฌ์คํธ๋ฅผ ์์ฑํด ์ค๋ค. ์์ x์ถ์ ์ ํ๋ ๋ ๊ฐ์ ์ขํ๋ฅผ ๋ฃ์ด์ค๋ค ์ผ์ชฝ์ ์ฌ๋ ๊ดํธ("(")๋ฅผ, ์ค๋ฅธ์ชฝ์ ๋ซ๋ ๊ดํธ(")")๋ฅผ ๋ฃ์ด ์ค๋ค.
2. ๋ฆฌ์คํธ ์ ๋ ฌ
๋ฐ์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๋ค.
์ขํ ์์ผ๋ก ์ฐ์ ์ ๋ ฌํ๊ณ , ๋ซํ ๊ดํธ(")")๊ฐ ๋จผ์ ์ค๊ฒ ์ ๋ ฌํ๋ค.
3. ์์ด ๋๋ ๋์ ์ฒ๋ฆฌ(์คํ ์ฌ์ฉ)
์ด์ ์ ๋ ฌ๋ ๋ฆฌ์คํธ๋ฅผ ์คํ์ ์ง์ด๋ฃ์ด ์ฃผ์ด์ผ ํ๋ค.
์คํ์๋ ์์ ์์น์ ๊ดํธ string, ์ด์ ์ ๊ณผ ์ ํ๋์ง ํ์ธํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ์ฃผ์ด์ผ ํ๋ค.
์ด์ ๋ฆฌ์คํธ๋ฅผ ์ํํ๋ฉด์ 2๊ฐ์ง์ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํด ์ค๋ค.
3-1. ์ฌ๋ ๊ดํธ๊ฐ ์จ ๊ฒฝ์ฐ
์คํ์ ์ต์๋จ ๋ฐ์ดํฐ์ ์ขํ์ ๋น๊ตํด์ ๊ฐ์ ์ขํ์ด๋ฉด peek ๋ฐ์ดํฐ์ ์ ํฉ ์ฌ๋ถ๋ฅผ true๋ก ์ค์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์คํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋๋ค.
3-2. ๋ซ๋ ๊ดํธ๊ฐ ์จ ๊ฒฝ์ฐ
๋ง์ฝ ํ์ฌ ์คํ์ ์ต์๋จ ๋ฐ์ดํฐ์ ์ ํฉ ์ฌ๋ถ๊ฐ true๋ผ๋ฉด ์์ญ ์นด์ดํธ๋ฅผ 2๊ฐ๋ฅผ ๋๋ ค์ฃผ๊ณ ์๋๋ฉด 1๊ฐ๋ฅผ ๋๋ ค์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์คํ ๋ฐ์ดํฐ๋ฅผ pop ํ๋ค.
๋ค์ ๋ฐ์ดํฐ์ ๊ฐ๊ณผ ํ์ฌ ๋ณด๊ณ ์๋ ๊ฐ์ ์ขํ๊ฐ ๋ค๋ฅด๋ฉด ์คํ์ ์ต์๋จ ๋ฐ์ดํฐ์ ์ ํฉ ์ฌ๋ถ๋ฅผ false๋ก ์ค์ ํ๋ค.
๋ฌธ์ ํด๊ฒฐ ์ฝ๋
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.Stack
private data class Circle(
val position: Int,
val circle: String,
var isContact: Boolean
)
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val n = readLine().toInt()
val point = mutableListOf<Pair<Int, String>>()
for (i in 1 .. n) {
val (x, r) = readLine().split(" ").map { it.toInt() }
point.add(Pair(x - r, "("))
point.add(Pair(x + r, ")"))
}
point.sortByDescending { it.second }
point.sortBy { it.first }
var area = 1
val stack = Stack<Circle>()
for (i in 0 until point.size) {
val current = point[i]
if (i == 0) stack.add(Circle(current.first ,current.second, false))
else {
when (current.second) {
"(" -> {
// ์ด์ ์์น์ ๊ฐ์ ์์น๋ฉด ์ ํด์๋ ์์.
if (stack.isNotEmpty() && stack.peek().position == current.first) stack[stack.lastIndex].isContact = true
stack.add(Circle(current.first, current.second, false))
}
")" -> {
if (!stack.peek().isContact) area++
else area += 2
stack.pop()
if (i + 1 in 0 until point.size) {
val next = point[i + 1]
// ๋ค์ ์๊ณผ ์ ํด ์์ง ์์ ๋
if (stack.isNotEmpty() && next.first != current.first) stack[stack.lastIndex].isContact = false
}
}
}
}
}
println(area)
}
๋ฌธ์ ํ์ด
์คํ์ ๊ฐ์ ๋ฃ์ data class๋ฅผ ์์ฑํด ์ค๋ค.
data class์๋ ์ขํ, ์์ ๊ตฌ์ฑ(๊ดํธ string), ์ ํฉ ์ฌ๋ถ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์ ๋ ฅ๊ฐ์ ๋ฐ๋ผ point ๋ฆฌ์คํธ๋ฅผ ๊ตฌ์ฑํด ์ค๋ค. point ๋ฆฌ์คํธ๋ pair๋ก ๊ตฌ์ฑํด ์ฃผ์๋ค.
์ฒซ ๋ฒ์งธ ๊ฐ์ด ์ขํ, ๋ ๋ฒ์งธ ๊ฐ์ด ์์ ๊ตฌ์ฑ ๋ฐ์ดํฐ(๊ดํธ string)์ด๋ค.
๊ตฌ์ฑํ point list๋ฅผ ๊ดํธ์์ผ๋ก ์ ๋ ฌํด ์ฃผ๊ณ ๊ทธ๋ค์ ์ขํ๋ณ๋ก ์ ๋ ฌํด ์ค๋ค.
๊ทธ๋์ผ ๋ซ๋ ๊ดํธ๊ฐ ๋จผ์ ์ค๊ฒ ๋๊ณ ์ฐ์ ์์๊ฐ ๋์ ์ขํ์์ ๋์ค์ ์ค์ ํจ์ผ๋ก์จ ์ขํ ์ฐ์ ์ ๋ ฌ์ด ๊ฐ๋ฅํด์ง๋ค.
์ด๊ธฐ area ๋ฐ์ดํฐ๋ 1๋ก ์ค์ ํด ์ค๋ค. ๊ทธ ์ด์ ๋ ์ ๋ฐ๊นฅ์ ์์ญ์ ํฌํจํ๊ธฐ ์ํด์์ด๋ค.
Circle data class ๋ฐ์ดํฐ๋ฅผ ๋ด๋ stack์ ๋ง๋ค์ด ์ค๋ค.
point list๋ฅผ ๋ฐ๋ณตํด ์ค๋ค.
์ฒซ ๋ฐ๋ณต์๋ ๋ฌด์กฐ๊ฑด ์ฌ๋ ๊ดํธ๊ฐ ๋ค์ด์ค๊ธฐ ๋๋ฌธ์ stack์ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด์ ์์ํ๋ค.
๋ ๋ฒ์งธ ๋ฐ๋ณต์์๋ถํฐ ๋ค์ด์ค๋ ๊ดํธ์ ๋ฐ๋ผ ํ๋จํด์ ๋ก์ง์ ์ ์ฉํ๋ค.
์ฌ๋ ๊ดํธ๊ฐ ๋ค์ด์ค๊ฒ ๋๋ฉด ์ด์ ์ ์ ์์ ์์ ์์ด ๋ค์ด์จ๋ค๋ ๋ป์ด ๋๋ค.
๋ค์ด์จ ๋ฐ์ดํฐ์ ์ขํ๊ฐ stack์ ์ต์๋จ ๋ฐ์ดํฐ์ ๋์ผํ๋ค๋ฉด ๋ ์์ด ์ ํด์๋ค๋ ๋ป์ด ๋๋ค.
์ด๋ฌ๋ฉด ํฐ ์์ ์์ญ์ด 2๊ฐ๊ฐ ์๊ธธ ๊ฐ๋ฅ์ฑ์ด ์๋ค. ๊ทธ๋์ ํฐ ์์ ์ ํฉ ์ฌ๋ถ๋ฅผ true๋ก ์ค์ ํ๋ค.
๋ซ๋ ๊ดํธ๊ฐ ๋ค์ด์ค๊ฒ ๋๋ฉด ์ด์ ๊ตฌ์ญ์ ๊ฐ์๋ฅผ ์ธ์ฃผ๋ฉด ๋๋ค.
๋ซ๋ ๊ดํธ๊ฐ ๋ค์ด์์ ๋ ๋ฌด์กฐ๊ฑด stack์๋ ์ฌ๋ ๊ดํธ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๊ฒ ๋๋ค.
์ฌ๋ ๊ดํธ ๋ฐ์ดํฐ์ ์ ํฉ ์ฌ๋ถ๋ฅผ ํ์ธํด ์ค๋ค. true์ด๋ฉด 2๋ฅผ false๋ฉด 1๊ฐ์ ์์ญ์ด ์๋ค๋ ๋ป์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๋ ๊ดํธ ๋ฐ์ดํฐ๋ฅผ stack์์ 1๊ฐ๋ฅผ ์ ๊ฑฐํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์์ ๋ค์ด์ค๊ฒ ๋ ๋ฐ์ดํฐ์ ํ์ฌ ๋ฐ์ดํฐ์ ์ขํ๋ฅผ ๋น๊ตํด ์ค๋ค. ๋ค์ ์๊ณผ ์ขํ๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ๋ค์ ์๊ณผ ์ ํด์์ง ์๋๋ค๋ ๋ป์ด๊ธฐ ๋๋ฌธ์ ์ ํฉ ์ฌ๋ถ๋ฅผ false๋ก ์ค์ ํด ์ค๋ค.
๊ทธ๋ฆผ์ผ๋ก ๋ฌธ์ ๋ก์ง์ ์ค๋ช ํด ์ฃผ๊ฒ ๋ค.
์ด ๊ทธ๋ฆผ์ผ๋ก ์ค๋ช ํด ๋ณด๊ฒ ๋ค. ํธ์๋ฅผ ์ํด ๊ฐ์ฅ ํฐ ์์ 2๋ฒ ์, ์ค๊ฐ ์์ 3๋ฒ ์, ์์ ์์ 4๋ฒ ์์ผ๋ก ์นญํ๊ฒ ๋ค.
- ์ฐ์ ๋จผ์ ๋ค์ด์ค๊ฒ ๋๋ 2๋ฒ ์์ ์ขํ๋ฅผ ํ์ธํ๋ค. ์ฌ๋ ๊ดํธ๋ก ๋ค์ด์ค๊ธฐ ๋๋ฌธ์ circle์ isContact๋ฅผ false๋ก ์ค์ ํ๊ณ stack์ ๋ฃ๋๋ค.
stack: [Circle(2๋ฒ ์, "(", false)], area: 1 - ๋ค์์ผ๋ก ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ 3๋ฒ ์์ ์ฌ๋ ๊ดํธ ๋ฐ์ดํฐ์ด๋ค. ํ์ฌ ์ขํ์ stack์ ์ต์๋จ ๋ฐ์ดํฐ์์ ์ขํ๊ฐ ๊ฐ๋ค. ๊ทธ๋์ ํ์ฌ stack์ ์ ํฉ ์ฌ๋ถ๋ฅผ true๋ก ๋ฐ๊ฟ์ค ๋ค์ stack์ ๊ฐ์ ๋ฃ๋๋ค.
stack: [Circle(2๋ฒ ์, "(", true), Circle(3๋ฒ ์, "(", false)], area: 1 - 3๋ฒ ์์ ๋ซ๋ ๊ดํธ๊ฐ ๋ค์ด์๋ค. ํ์ฌ stack์ ์ต์๋จ ๋ฐ์ดํฐ์ ์ ํฉ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค. false์ด๋ฏ๋ก area์ 1์ ๋ํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ stack์ ๊ฐ 1๊ฐ๋ฅผ ์ญ์ ํ๋ค.
stack: [Circle(2๋ฒ ์, "(", true)], area: 2 - ๋ค์ ์์ ์ขํ๋ฅผ ํ์ธํ๋ค(4๋ฒ ์์ ์ฌ๋ ๊ดํธ ๋ฐ์ดํฐ). ๋ค์ ์์ ์ขํ ๋ฐ์ดํฐ์ ํ์ฌ ๋ณด๊ณ ์๋ ๋ฐ์ดํฐ(3๋ฒ ์์ ๋ซ๋ ๊ดํธ)๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ stack์ ์ต์๋จ ๋ฐ์ดํฐ์ ์ ํฉ ์ฌ๋ถ๋ฅผ false๋ก ๋ณ๊ฒฝํ๋ค.
stack: [Circle(2๋ฒ ์, "(", false)], area: 2 - 4๋ฒ ์์ ์ฌ๋ ๊ดํธ๊ฐ ๋ค์ด์๋ค. ํ์ฌ stack์ ์ต์๋จ ๋ฐ์ดํฐ์ ํ์ฌ ๋ฐ์ดํฐ์ ์ขํ๋ฅผ ๋น๊ตํ๋ค. ์ขํ๊ฐ์ด ๋ค๋ฅด๋ค. ๊ทธ๋์ stack์ ์ต์๋จ ๋ฐ์ดํฐ์ ์ ํฉ ์ฌ๋ถ๋ฅผ false๋ก ๋ณ๊ฒฝํ๋ค. ๊ทธ๋ฆฌ๊ณ stack์ ๋ฃ์ด ์ค๋ค.
stack: [Circle(2๋ฒ ์, "(", false), Circle(4๋ฒ ์, "(", false)], area: 2 - 4๋ฒ ์์ ๋ซ๋ ๊ดํธ๊ฐ ๋ค์ด์๋ค. ํ์ฌ stack์ ๋ฐ์ดํฐ์ ์ ํฉ ์ํ๋ฅผ ํ์ธํ๋ค. false์ด๋ฏ๋ก area์ 1์ ๋ํ๋ค. ๊ทธ๋ฆฌ๊ณ stack์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ค.
stack: [Circle(2๋ฒ ์, "(", false)], area: 3 - ๋ค์ ๋ฐ์ดํฐ๋ 2๋ฒ ์์ ๋ซ๋ ๊ดํธ์ด๋ค. ๋ค์ ๋ฐ์ดํฐ์ ํ์ฌ ๋ฐ์ดํฐ(4๋ฒ ์์ ๋ซ๋ ๊ดํธ)์ ์ขํ๋ฅผ ๋น๊ตํ๋ค. ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ stack ๋ฐ์ดํฐ์ ์ ํฉ ์ฌ๋ถ๋ฅผ false๋ก ์ค์ ํด ์ค๋ค.
stack: [Circle(2๋ฒ ์, "(", false)], area: 3 - ๋ง์ง๋ง ๋ฐ์ดํฐ์ธ 2๋ฒ ์์ ๋ซ๋ ๊ดํธ๊ฐ ๋ค์ด์๋ค. ํ์ฌ stack์ ์ต์๋จ ๋ฐ์ดํฐ์ ์ ํฉ ์ํ๋ฅผ ํ์ธํ๋ค. false์ด๋ฏ๋ก area์ 1์ ๋ํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ stack์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ค.
stack: [], area: 4 - stack์ด ๋น์ด์๋ค๋ ๊ฒ๊ณผ, ๋ค์ ๋ฐ์ดํฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ฐ์ดํฐ์ ๋น๊ตํ๋ ๋ก์ง์ ์ํ๋์ง ์๋๋ค.
- ๋ฐ๋ณต๋ฌธ ์ข ๋ฃ ํ ์ต์ข area๋ฅผ ์ถ๋ ฅํ๋ฉด 4๊ฐ ๋๋ค.
๋ฌธ์ ํด๊ฒฐ ๊ณผ์
๋ฌธ์ ์ ๊ทผ ๋ฐฉ์์ ๋ณด๊ณ ๋ ๊ตฌํํ๋ ๊ฒ ์ด๋ ค์์ ์์ ์ธ๊ธํ ๋ถ์ ํฌ์คํ ์ ์ฐธ๊ณ ํด์ ๋ก์ง์ ๊ตฌ์ฑํด ์ฃผ์๋ค.
๋ด ๋๋ฆ๋๋ก ๋ก์ง ํด์์ ํตํด ์กฐ๊ธ์ด๋ผ๋ ๋ค๋ฅด๊ฒ ๊ตฌํํ๊ณ ์ถ์์ง๋ง ๊ทธ๊ฒ ์ ์๋๋๋ผ.
๋ก์ง์ด ๋์๊ฐ๋ ๊ณผ์ ์ ๊ธ๋ก ์ ์ด๋ณด๋๊น ์ ๋ฆฌ๋ ๋๊ณ ์ดํด๊ฐ ํจ์ฌ ๋ ์ ๋์๋ค.
์ขํ๋ฅผ ๋ถ๋ฌ์ ์ ๋ ฌํ๊ณ , stack์ ์ฌ์ฉํด ์์ญ์ ์ธ์ผ ํ๋ ์ด๋ ค์ด ๋ฌธ์ ์๋ค. ํ๋ํฐ๋์ธ ์ด์ ๊ฐ ์๊ตฌ๋ ์ญ์.