๐ ๋ฌธ์
๐ง ์์ด๋์ด
๊ฐ๋ก 6, ์ธ๋ก 12๋ฅผ ๊ฐ๋ ํ ํธ๋ฆฌ์ค ํ์ ์ผ์ข ์ด๋ค
์ฐ์ 4๊ฐ ์ด์์ ๋ฟ์ ์กฐ๊ฐ์ด ์ธ์ ํด์์ ๋๋ง '.'์ผ๋ก ๋์นํ๋ค.
+ '.'์ผ๋ก ๋์น๋ ์กฐ๊ฐ์ด ์์ผ๋ฉด ์๋๋ก ๋ฟ์์กฐ๊ฐ์ ๋น๊ฒจ์ผํ๋ค.
๋ฟ์ ์กฐ๊ฐ์ ๋น๊ธฐ๋ ์์ด๋์ด๊ฐ ํต์ฌ์ด๋ค.
์ธ๋ก ๋ง๋๋ฅผ ์๋ฏธํ๋ LinkedList ๋ฅผ ๋ฏธ๋ฆฌ 6๊ฐ ์์ฑํด๋๊ณ '.'๋ง์ ๋ชจ๋ ์ ๊ฑฐํด ๋จ์ ๋ฟ์ ์กฐ๊ฐ์ ๋ฟ์ํ์ ๋ถ์ฌ๋ฃ๋๋ค.
๋, ํ ํฌ๊ธฐ ์์ฒด๊ฐ 12 * 6 == 72ํ๋ก ์์ผ๋ฏ๋ก ์ ์ฒด ํ์ ๋งค๋ฒ ๊ธ์ด๋ ์๊ฐ ์ด๊ณผํ์ง ์๊ฒ ๋ค๋ ์ง๊ด์ ๊ฐ์ง๊ณ ํ์ดํ๋ค.
ํ๋์ ๋ฟ์์กฐ๊ฐ์ด ๋ค์ ๋จ๊ณ๋ก ์ด์ด์ง๋ ค๋ฉด ๋งค๋ฒ 4์กฐ๊ฐ์ฉ ํด๋ ์ด 18๋ผ์ด๋๊ฐ ์ต๋๋ค.
72 * 72 * 18 => ์ฝ 10๋ง ์ผ๋ก ์ ๋ ์๊ฐ์ด๊ณผ๊ฐ ๋์ง์๋๋ค.
๐ Kotlin Code
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*
private val dx = intArrayOf(1, 0, -1, 0)
private val dy = intArrayOf(0, 1, 0, -1)
private fun bfs(startRowIdx: Int, startColIdx: Int, map: Array<CharArray>, visited: Array<BooleanArray>) : Boolean {
visited[startRowIdx][startColIdx] = true
val startColor = map[startRowIdx][startColIdx]
val sameColorPoints = LinkedList<IntArray>()
val queue : Queue<IntArray> = LinkedList<IntArray>()
queue.add(intArrayOf(startRowIdx, startColIdx))
while (queue.isNotEmpty()) {
val (curRow, curCol) = queue.poll()
sameColorPoints.add(intArrayOf(curRow, curCol))
for (idx in dx.indices) {
val nextRow = curRow + dx[idx]
val nextCol = curCol + dy[idx]
if (nextRow < 0 || nextCol < 0 || nextRow >= map.size || nextCol >= map[0].size) continue
if (visited[nextRow][nextCol]) continue
if (map[nextRow][nextCol] != startColor) continue
queue.add(intArrayOf(nextRow, nextCol))
visited[nextRow][nextCol] = true
}
}
if (sameColorPoints.size >= 4) {
// break
sameColorPoints.forEach { (row,col)->
map[row][col] = '.'
}
return true
}
return false
}
fun main() {
val bufferedReader = BufferedReader(InputStreamReader(System.`in`))
val map = Array(12){CharArray(6)}
for (i in 0 .. 11) {
map[i] = bufferedReader.readLine().toCharArray()
}
val visited = Array(12){BooleanArray(6)}
val emptyLine = charArrayOf('.', '.', '.', '.', '.', '.')
var answer = 0
while (true) {
// index: column, value: charArray linked list (์ธ๋ก ์ค)
val puyoColumnList = Array(6){ LinkedList<Char>() }
var existBreak = false
// ๋งค ๋ผ์ด๋๋ฅผ ์ฐ์ธก ํ๋จ๋ถํฐ ์ข์ธก ์๋จ๊น์ง
for (row in map.indices.reversed()) {
for (col in map[row].indices.reversed()) {
if (!visited[row][col] && map[row][col] != '.') {
// ๊นจ์ง ํ์๊ฐ ์๋ ๊ฒ๋ค์ '.' ์ผ๋ก ์์น ๋จ.
if(bfs(row, col, map, visited)) existBreak = true
}
}
}
if (!existBreak) break
else answer++
visited.forEach { Arrays.fill(it, false) }
// ์๋์์ ์๋ก ํ์นธ์ฉ, ๋งจ ์ผ์ชฝ์นธ๋ถํฐ ์ค๋ฅธ์ชฝ์ผ๋ก
for (col in map[0].indices) {
for (row in map.indices.reversed()) {
puyoColumnList[col].add(map[row][col])
}
}
// pull down
for (puyoColumn in puyoColumnList) {
puyoColumn.removeIf { it == '.' }
}
// pull down ์ฒ๋ฆฌ ๋ puyoColumn ์ ์ํ๋ฅผ map ์ ๋ถ์ฌ๋ฃ๊ธฐ.
// puyoColumn ์๋ ์์ ์กฐ๊ฐ๋ง ์กด์ฌํ๋ฏ๋ก size ๋งํผ ๋ถ์ฌ๋ฃ๊ณ ๋๋จธ์ง๋ ์ ๋ถ '.'์ผ๋ก ์ฑ์๋ฃ๊ธฐ
for (row in map.indices) {
map[row] = emptyLine.copyOf()
}
// . ์ ๊ฑฐํ๊ณ ๋จ์ ๊ฒ ๋ฎ์ด์ฐ๊ธฐ
for (col in map[0].indices) {
๋งจ ๋์นธ๋ถํฐ ๋ถ์ฌ๋ฃ์.
var rowIdx = 11
for (puyoColumn in puyoColumnList[col]) {
map[rowIdx--][col] = puyoColumn
}
}
}
print(answer)
}
๐ง ์์ด๋์ด 2
๋ชจ๋ ๋ฟ์ ์กฐ๊ฐ๋ค์ด index ์ ๋งจ ๋์ ์์นํด์์ด index ์ปจํธ๋กค์ ๋์์๋ถํฐ (๊ฐ๋ก5, 4, 3 ..0), (์ธ๋ก 11, 11 ... 0) ํ์ง๋ง
๋ฟ์ํ์ ์ ๋ฐ๋๋ก ๋ค์ง๊ณ ์์ํ๋ฉด ๋์ด ์๋๋ผ ์ (๊ฐ๋ก 0.. 6) (์ธ๋ก 0..11)๋ก ๋ณํํ์ฌ ๋ ์ฝ๊ฒ ํ์ดํ ์ ์๋ค.
@Test
internal fun testArrayReverse(){
val arr = arrayOf(
charArrayOf('.', 'Y', 'G', '.', '.', '.'),
charArrayOf('R', 'R', 'Y', 'G', '.', '.'),
charArrayOf('R', 'R', 'Y', 'G', 'G', '.')
)
arr.reverse()
for (row in arr) {
println(row)
}
}
'Algorithm > Algorithm (๋ฌธ์ ํ์ด)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 2457 ๊ณต์ฃผ๋์ ์ ์ (0) | 2022.10.21 |
---|---|
[๋ฐฑ์ค] 14499 ์ฃผ์ฌ์ ๊ตด๋ฆฌ๊ธฐ (0) | 2022.10.13 |
[๋ฐฑ์ค] 10799 ์ ๋ง๋๊ธฐ (0) | 2022.10.11 |
[๋ฐฑ์ค] 15686 ์นํจ ๋ฐฐ๋ฌ (1) | 2022.10.10 |
[๋ฐฑ์ค] 1504 ํน์ ํ ์ต๋จ๊ฒฝ๋ก (0) | 2022.10.07 |