IOIOI(5525๋ฒ)
Silver 1
#๋ฌธ์์ด
๋ฌธ์ ๋ด์ฉ
๋ฌธ์ ์ ๊ทผ
์ฒซ ์ค์ ์ ๋ ฅ์ผ๋ก O๊ฐ ๋ช ๊ฐ ๋ค์ด ์๋์ง ํ์ธํ๋ค.
์๋ฅผ ๋ค์ด O = 1์ด๋ฉด IOI, O = 3์ด๋ฉด IOIOIOI์ด ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์์ด์ IOI ๋ฌธ์์ด์ด๋ผ๊ณ ๋ถ๋ฅด๊ฒ ๋ค.
IOI ๋ฌธ์์ด์ด 3๋ฒ์งธ ์ค์ ์ ๋ ฅ๋์ด ์๋ ๋ฌธ์์ด์ ๋ช ๊ฐ๊ฐ ํฌํจ๋์ด ์๋์ง ๊ตฌํด์ผ ํ๋ค.
IOI ๋ฌธ์์ด์ด IOIOI์ด๊ณ , ๋ฌธ์์ด์ด IIOIOIOIIOO์ผ ๋๋,
1. IIOIOIOIIOO
2. IIOIOIOIIOO
๋ก ์ด 2๊ฐ์ง์ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํ ์ ์๋ค. ๊ฒน์น๋ ๊ฒฝ์ฐ๊น์ง ์๊ฐํด์ผ ํ๋ค.
IOI๋ฌธ์์ด์ ์ฒ์์ I๋ก ์์ํ๊ณ ์ญ ๊ณ์ OI๊ฐ ๋ฐ๋ณต๋๋ค๋ ๊ท์น์ด ์๋ค.
O = 1์ผ ๋ IOI,
O = 3์ผ ๋ IOIOIOI ์ธ ๊ฒ์ฒ๋ผ.
์ด๋ฅผ ์ด์ฉํด ์ฒ์์ ์์ ๋ฌธ์๊ฐ I๋ก ์์ํ๊ณ , ๊ทธ๋ค์์ OI๊ฐ ์ฐ์๋๋์ง ์ฒดํฌํ๋ฉด ๋๋ค.
์์ ์ ๋ ฅ 1์ 3๋ฒ์งธ ์ค์ ๋ฌธ์์ด์ ์๋ก ๋ค์ด ๋ณด๊ฒ ๋ค.
OOIOIOIOIIOII
๋ค์๊ณผ ๊ฐ์ ๋ฌธ์์ด์์ ์์์ ์ธ๊ธํ ๋ฐฉ์์ ์ ์ฉํด ๋ณด์.
s๋ ์ ๋ ฅ ๋ฌธ์์ด์ ํ๋์ฉ ํ์ธํ๋ ๊ฒ์ด๋ค.
check๋ ํ์ฌ ๋ฌธ์์ด์ด OI๊ฐ ๋ฐ๋ณต๋๋์ง ํ์ธํ๋ ๊ฒ์ด๋ค. ์ฒ์์ I๊ฐ ์์๋๋ฉด ํ์ฌ ๋ฌธ์์ด์ ์ฒดํฌํ๊ธฐ ์์ํ๋ค.
ioCnt๋ ์ต์ข ์ฐ์๋ OI์ ๊ฐ์๋ฅผ ๋ํ๋ผ ๊ฒ์ด๋ค. ์ฐ์ OI๊ฐ ๋๊ธฐ๋ฉด ์๋ก์ด ํ๋๋ฅผ ์์ฑํด ๊ทธ ํ๋์ ์๋ก ๊ธฐ๋กํ๋ค.
์์ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ํ๋ก ๋ํ๋ด ๋ดค๋ค. ioCnt๋ฅผ ๋ณด๊ณ ํ์ฌ IOI ๋ฌธ์์ด๊ณผ ๋น๊ต๋ฅผ ํด์ ๊ฐ์ ๊ตฌํด์ค ์ ์๋ค.
์ ํ์ ioCnt๋ 3, 1, 0์ด๋ค. 0์ธ ๊ฒฝ์ฐ๋ฅผ ๋นผ๋ฉด 3, 1๋ง ๋จ๋๋ค.
์ฌ๊ธฐ์ O = 1์ธ ๊ฒฝ์ฐ์๋ ๊ณต๊ฐ์ 1์ฉ ์ฐจ์งํ๊ธฐ ๋๋ฌธ์ ํฌํจ๋ ๊ฐ์๋ 4๊ฐ๊ฐ ๋๋ค.
O = 2์ธ ๊ฒฝ์ฐ๋ ๊ฒฝ์ฐ๊ฐ ์ฝ๊ฐ ๋ค๋ฅด๋ค.
3์์ ๊ณต๊ฐ์ 2์ฉ ์ฐจ์งํ๊ธฐ ๋๋ฌธ์ ๊ฒฝ์ฐ์ ์๊ฐ 2๊ฐ์ง๊ฐ ๋๋ค. [1, 2]์ [2, 3]์ด๋ค. ๋ฌธ์๊ฐ ์ฐ์๋์ด ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ [3, 1]์ ์๋๋ค.
๋ค์์ 1์ ๊ณต๊ฐ 2๋ณด๋ค ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ๋๊ธฐ๋ฉด ์ต์ข ์ ์ธ ํฌํจ ๊ฐ์๋ 2๊ฐ๊ฐ ๋๋ค.
์ด์ check์ ioCnt๊ฐ ๋ณ๊ฒฝ๋๊ธฐ ์ํด ์ด๋ค ์กฐ๊ฑด์ด ํ์ํ์ง ์ฝ๋๋ฅผ ์ด์ฉํด์ ํ์ธํด ๋ณด์.
<์กฐ๊ฑด 1>
check๋ ์ฒ์์ ์ฒซ I๊ฐ ๋ค์ด์ค๊ธฐ ์ ๊น์ง๋ ๋น ๋ฌธ์์ด๋ก ์กด์ฌํ๋ค.
์ฒซ I๊ฐ ๋ค์ด์์์ ๋ํ๋ผ ๋ณ์๋ฅผ firstI๋ก ์ง์ ํด ์ฃผ๊ฒ ๋ค.
firstI๊ฐ true์ฌ์ผ ํ๊ณ , ์ฒซ ๋ฌธ์๋ O์ฌ์ผ ํ๋ค. OI์์๋๋ก ์ฐ์๋ผ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ check๋ ๋น์ด ์๋ ์ํ์ฌ์ผ ํ๋ค.
์ด๋ฅผ ์ฝ๋๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
if (firstI && string[i] == 'O' && check.isEmpty())
<์กฐ๊ฑด 2>
์ด์ ์กฐ๊ฑด 1์ ๋ง์กฑํ์ผ๋ฉด check์ O๊ฐ ๋ค์ด์จ ์ํ์ผ ๊ฒ์ด๋ค.
์กฐ๊ฑด 1๊ณผ ๋ง์ฐฌ๊ฐ์ง๊ณ firstI๊ฐ true์ฌ์ผ ํ๋ ๊ฑด ๊ฐ๊ณ , ๋ค์ ๋ฌธ์๋ก๋ I๊ฐ ์์ผ ํ๋ค. ๋ํ check์ ํ์ฌ ๋ง์ง๋ง ๋ฌธ์๊ฐ O์ฌ์ผ ํ๋ค.
ํน์ ๋ชจ๋ฅผ ๋ณดํ์ผ๋ก check๊ฐ ๋น์ด์์ง ์์์ผ ํ๋ ์กฐ๊ฑด๋ ๊ฐ์ด ์ถ๊ฐํ์.
์ด๋ฅผ ์ฝ๋๋ก ๋ํ๋ด ๋ณผ๊น?
else if (check.isNotEmpty() && firstI && string[i] == 'I' && check.last() == 'O')
<์กฐ๊ฑด 3>
์กฐ๊ฑด 1, 2๋ฅผ ๋ง์กฑํ์ง ๋ชปํ๋ฉด ์ด์ ์กฐ๊ฑด 3์ผ๋ก ๋์ด์์ผ ํ๋ค.
์กฐ๊ฑด 3์๋ ์ฌ์ง 1-1์ I๊ฐ ์ฐ์ํด์ ๋ํ๋ฌ์ ๋์ฒ๋ผ check๋ฅผ clear ์์ผ ์ค์ผ ํ๋ค.
๋ํ I๊ฐ ์ฐ์ํด์ ๋ํ๋๋ ๊ฒฝ์ฐ๋ ์๊ณ , O๊ฐ ์ฐ์ํด์ ๋ํ๋ ์๋ ์์ ๊ฒ์ด๋ค.
๋ง์ฝ I๊ฐ ์ฐ์ํด์ ๋ํ๋๋ค๋ฉด firstI๋ฅผ true๋ก ๊ณ์ ์ด๋ ค๋๋ ์๊ด์์ง๋ง, ๋ง์ฝ O๊ฐ ์ฐ์ํด์ ๋ํ๋๋ค๋ฉด firstI๋ฅผ false๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค.
๋ํ ์ด๋ฏธ ์ฐ์๋ ๊ฐ์ด ๋ค์ด๊ฐ ioCntList์ ๊ฐ์ด ๋ค์ด๊ฐ ๊ฒฝ์ฐ์๋ ๋ค์ index์ ๊ฐ์ด ๋ค์ด๊ฐ ์ ์๋๋ก ์ฒ๋ฆฌํด์ฃผ์ด์ผ ํ๋ค.
else {
check.clear()
if (string[i] != 'I') firstI = false
if (ioCntList[ioCntIndex] != 0) ioCntList++
}
<์กฐ๊ฑด 4>
์กฐ๊ฑด 4๋ ์์๋ก ํ์ธํด์ผ ํ๋ ์กฐ๊ฑด์ด๋ค.
check๊ฐ OI์ธ์ง ํ์ธํด ์ค์ผ ํ๋ค. ๋ง์ฝ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด check๋ฅผ clear ์์ผ์ฃผ๊ณ , ํ์ฌ ์ฐ์๋ OI์ ๊ฐ์๋ฅผ ์ ์ฅํ๋ ioCntList๋ฅผ ๋๋ ค ์ค๋ค.
if (check.toString() == "OI") {
check.clear()
ioCntList[ioCntIndex]++
}
์ ์กฐ๊ฑด 4๊ฐ๋ฅผ ์ด์ฉํด ์ฝ๋๋ก ๊ตฌํํด ๋ณด์.
๋ฌธ์ ํด๊ฒฐ ์ฝ๋
import java.io.BufferedReader
import java.io.InputStreamReader
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val oCnt = readLine().toInt()
val stringLength = readLine().toInt()
val string = readLine()
val checkString = StringBuilder()
for (i in 1 .. oCnt * 2 + 1) {
checkString.append(
if (i % 2 == 0) "O"
else "I"
)
}
val check = StringBuilder() // ํ์ฌ ๋ฌธ์์ด์ ์ง์ ๋ฐ์ผ๋ฉด์ ์ฒดํฌํจ.
val ioCntList = MutableList(stringLength) { 0 } // OI๊ฐ ์ผ๋ง๋ ์ฐ์๋์ด์ ๋ํ๋๋์ง ํ์ธ.
var ioCntIndex = 0 // ioCntList์ ๊ฐ์ด ์ถ๊ฐ๋ index
var firstI = false // OI๋ฅผ ์ฒดํฌํ๊ธฐ ์ ์ ์ฒซ ๋ฒ์งธ์ I๊ฐ ์๋์ง ํ์ธ.
for (i in 0 until stringLength) {
if (!firstI && string[i] == 'I') firstI = true
if (firstI && string[i] == 'O' && check.isEmpty()) check.append("O")
else if (check.isNotEmpty() && firstI && string[i] == 'I' && check.last() == 'O') check.append("I")
else {
check.clear()
if (string[i] != 'I') firstI = false
if (ioCntList[ioCntIndex] != 0) ioCntIndex++
}
if (check.toString() == "OI") {
check.clear()
ioCntList[ioCntIndex]++
}
}
var res = 0
for (i in 0 until ioCntList.size) {
if (ioCntList[i] == 0) break
if (ioCntList[i] >= oCnt)
res += ioCntList[i] - (oCnt - 1)
}
println(res)
}
๋ฌธ์ ํ์ด
์ฒ์์ ์ ๋ ฅ๋ O์ ๊ฐ์(oCnt)์ ๋ง๊ฒ IOI ๋ฌธ์์ด์ ์์ฑํ๋ค.
๊ทธ๋ค์ ์ ๋ ฅ๋ฐ์ ๋ฌธ์์ด์ ๋๋ฉด์ OI๊ฐ ์ฐ์๋๋์ง ํ์ธํ๋ค.
์กฐ๊ฑด์ ํ์ธํ๊ธฐ ์ ์ ๋จผ์ firstI๋ฅผ ๋ณ๊ฒฝํด์ค์ผ ํ๋ค. I๋ก ์์ํ๋ ์๊ฐ firstI๋ฅผ true๋ก ๋ฐ๊ฟ์ค๋ค.
์กฐ๊ฑด 1์ ํตํด check์ O๋ฅผ ๋ฃ์ด ์ฃผ๊ณ , ์กฐ๊ฑด 2๋ฅผ ํตํด I๋ฅผ ๋ฃ์ด ์ค๋ค.
์กฐ๊ฑด 3์์๋ ์ฐ์๋ OI๊ฐ ๋๊ฒผ์ ๋ ๋ก์ง์ ์ฒ๋ฆฌํ๋ค.
์กฐ๊ฑด 4๋ ์์๋ก ํ์ธํ๋ฉฐ, chek๊ฐ OI๋ผ๋ฉด check๋ฅผ clear ์ํค๊ณ ioCntList๋ฅผ ๋๋ ค ์ค๋ค.
๋ฌธ์ ํด๊ฒฐ ๊ณผ์
์ฒ์์๋ ๋ฐ๋ณต์ subString์ ์ด์ฉํด ํ์์ง๋ง ์๊ฐ ์ด๊ณผ๋ก 100์ ์ ๋ง์ง ๋ชปํ๋ค.
๊ทธ๋์ ๋ค๋ฅธ ์ฌ๋์ ๋ฌธ์ ์ ๊ทผ๋ฒ์ ๊ฐ๋ตํ๊ฒ ์ฐพ์๋ด์ OI๊ฐ ๋ฐ๋ณต๋๋ค๋ ๊ฒ์ ์๊ฒ ๋๊ณ ๊ทธ์ ๋ง๊ฒ ๋ฐ๋ณต๋ OI์ ๊ฐ์๋ฅผ ๊ตฌํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
'๐ฏ | ๋ฐฑ์ค > ๐ | Silver' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin, S5] ๋ฐฑ์ค 9196๋ฒ ์ ์ ์ง์ฌ๊ฐํ (0) | 2024.08.09 |
---|---|
[Kotlin, S5] ๋ฐฑ์ค 1340๋ฒ ์ฐ๋ ์งํ๋ฐ (0) | 2024.08.08 |
[Kotlin, S1] ๋ฐฑ์ค 1389๋ฒ ์ผ๋น ๋ฒ ์ด์ปจ์ 6๋จ๊ณ ๋ฒ์น (0) | 2024.08.05 |
[Kotlin, S2] ๋ฐฑ์ค 30804๋ฒ ๊ณผ์ผ ํํ๋ฃจ (0) | 2024.08.05 |
[Kotlin, S2] ๋ฐฑ์ค 21736๋ฒ ํ๋ด๊ธฐ๋ ์น๊ตฌ๊ฐ ํ์ํด (0) | 2024.08.04 |