Problem
Solution
1. ๋จผ์ ๊ฒ์ ๋ธ๋ก์ ๋จ์ด๋จ๋ ค ์ญ์ ๊ฐ ๊ฐ๋ฅํ ๋ธ๋ก๋ค์ ์ฐพ์๋ธ๋ค.
์ฃผ์ด์ง ๋ธ๋ก์ ์ฐจ๋ก๋๋ก 1๋ฒ ๋ธ๋ก์ 0,1,2,3 ํ์ , 2๋ฒ ๋ธ๋ก์ 0,1,2,3 ํ์ , 3๋ฒ ๋ธ๋ก์ 0,1,2,3ํ์ ์ด ์๋ค๊ณ ๊ฐ์ ํ ๋
๊ฒ์ ๋ธ๋ก์ ์์์ ๋จ์ด๋จ๋ ค์ ์ฑ์์ผ ํ๋ ๊ฒ์ด๋ฏ๋ก 1๋ฒ ๋ธ๋ก์ 2,3 ํ์ , 2๋ฒ ๋ธ๋ก์ 1,2 ํ์ 3๋ฒ ๋ธ๋ก์ 0๋ฒ ํ์ ๋ง ์ญ์ ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
2. ์ฃผ์ด์ง ๋ณด๋์์ ๋ธ๋ก์ ์ข ๋ฅ, ํ์ , ์ธ๋กor๊ฐ๋ก, ์์น๋ฅผ ์ฐพ์๋ธ๋ค.
์๋์ ๊ฐ์ด ๋ธ๋ก์ ํ๊ณผ ์ด์ ํตํด์ ์ธ๋ก๋ก ์๋์ง ๊ฐ๋ก๋ก ์๋์ง๋ฅผ ๊ตฌ๋ณํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ํตํด ๋จผ์ ๊ฐ๋ก๋ก ๋ ๋ธ๋ก๋ค์ ์ ์ฒด ๋ณด๋์์ ์ฐพ์ต๋๋ค.
๋จผ์ ์ธ๋ก๋ก ๋ ๋ธ๋ก์ ์ฐพ์๋ด๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ด 2x3 ๋ชจ์์ (0,0) ๋ถํฐ (N-1,N-1) ๊น์ง ํ์ธํด์ ๋๊ฐ์ ์ซ์๊ฐ 4๊ฐ๊ฐ ์๋ค๋ฉด ๋ธ๋ก์ด ์กด์ฌํ๋ค๋ ์๋ฏธ์ ๋๋ค.
๊ฐ๋ก๋ก ๋ ๋ธ๋ก์ 3x2 ๋ชจ์์ ์ธ๋ก์ ๋ง์ฐฌ๊ฐ์ง๋ก (0,0) ๋ถํฐ (N-1,N-1) ๊น์ง ํ์ธํด์ ์ฐพ์์ค๋๋ค.
* ๋ธ๋ก์ ์ฐพ๋ ํจ์
func findBlocks(_ board:[[Int]],_ isVertical:Bool) {
let row = isVertical ? 3 : 2
let col = isVertical ? 2 : 3
for i in 0...board.count-row {
for j in 0...board.count-col {
var block:[[Int]] = Array(repeating: [], count: row)
for k in 0..<row {
block[row-1-k] = Array(board[i+k][j...j+col-1])
}
let change = isExistEqual4Number(block)
if let change = change {
let equal = checkEqualBlock(change, isVertical: isVertical, position: CGPoint(x: j, y:i+row-1))
if let equal = equal {
blocks.append(equal)
}
}
}
}
}
* ๋๊ฐ์ ์ซ์๊ฐ 4๊ฐ ์๋์ง ํ๋ณํ๋ ํจ์
func isExistEqual4Number(_ block:[[Int]]) -> [[Int]]? {
var numberCount:[Int:Int] = [:]
var changeBlock:[[Int]] = []
for b in block {
for n in b {
if numberCount[n] == nil && n != 0 {
numberCount[n] = 1
}else {
numberCount[n]! += 1
}
}
}
for (n,c) in numberCount {
if c == 4 {
for (i,b) in block.enumerated() {
changeBlock.append([])
for e in b {
let oneOrZero = e == n ? 1 : 0
changeBlock[i].append(oneOrZero)
}
}
return changeBlock
}
}
return nil
}
* ์ด๋ ์ข ๋ฅ์ ๋ธ๋ก์ธ์ง ํ์ธํ๊ณ ํด๋น ๋ธ๋ก์ ๋ง๊ฒ ๋ฐ๊ฟ์ฃผ๋ ํจ์
func checkEqualBlock(_ block:[[Int]],isVertical:Bool,position:CGPoint) -> Block? {
let type = isVertical ? [1,3] : [0,2]
for i in 1...3 {
for t in type {
if numberTypes[i]![t] == block {
return Block(position: position, number: i, type: t, isVertical:isVertical)
}
}
}
return nil
}
3. ์ฐพ์๋ธ ๋ธ๋ก ์ค ์ญ์ ๊ฐ๋ฅํ์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค.
๋ธ๋ก์ด ์ญ์ ๊ฐ ๊ฐ๋ฅํ์ง๋ฅผ ํ๋ณํ๊ธฐ ์ํด์ ์ฐ์ 1์์ ๊ตฌํ 1๋ฒ ๋ธ๋ก์ 2,3 ํ์ , 2๋ฒ ๋ธ๋ก์ 1,2 ํ์ 3๋ฒ ๋ธ๋ก์ 0๋ฒ ํ์ ์ค ํ๋์ฌ์ผ ํ๊ณ , ํด๋น ๋ธ๋ก์ ๋น์นธ์ ์์ ์๋ฌด๋ฐ ๋ธ๋ก์ด ์์ด์ผ ํฉ๋๋ค.
* ์ด 5๊ฐ ํ์ ์ ๋ธ๋ก์ ์ ์นธ์ ์๋ฌด๋ฐ ๋ธ๋ก์ด ์๋์ง ํ์ธํ๋ ํจ์
func checkAboveBlocks(_ block:Block,_ board:inout [[Int]]) {
var xs:[Int] = []
let x = Int(block.position.x)
let y = Int(block.position.y)
var remove:[(Int,Int)] = []
if block.number == 1 && block.type == 2{
xs = [x+1,x+2]
remove = [(x,y),(x+1,y),(x+2,y),(x,y-1)]
}else if block.number == 1 && block.type == 3 {
xs = [x]
remove = [(x,y),(x+1,y),(x+1,y-1),(x+1,y-2)]
}else if block.number == 2 && block.type == 1 {
xs = [x+1]
remove = [(x,y),(x+1,y),(x,y-1),(x,y-2)]
}else if block.number == 2 && block.type == 2 {
xs = [x,x+1]
remove = [(x,y),(x+1,y),(x+2,y),(x+2,y-1)]
}else if block.number == 3 && block.type == 0 {
xs = [x,x+2]
remove = [(x,y),(x+1,y),(x+2,y),(x+1,y-1)]
}else {
return
}
for x in xs {
for y in 0...y-1 {
if board[y][Int(x)] != 0 {
return
}
}
}
for r in remove {
board[r.1][r.0] = 0
}
count += 1
}
4. ์ญ์ ๊ฐ๋ฅํ ๋ธ๋ก์ ๊ฐฏ์๋ฅผ ๋ฐํํ๋ค.
์ฐพ์๋ธ ๋ธ๋ก ์ ์ฒด์์ ์ญ์ ๊ฐ๋ฅํ ๋ธ๋ก์ ๊ฐฏ์๋ฅผ ์ฐพ์์ ๋ฐํํฉ๋๋ค.
* ์ญ์ ๊ฐ๋ฅํ ๋ธ๋ก์ ๊ฐฏ์๋ฅผ ๊ตฌํ๋ ํจ์
func countRemovableBlocks(_ board:[[Int]]) -> Int {
var board = board
let sorted = blocks.sorted {$0.position.y < $1.position.y}
for block in sorted {
checkAboveBlocks(block,&board)
}
return count
}
Source Code
'๐ Problem Solution > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] ํ๋ก๊ทธ๋๋จธ์ค ๊ตฌ๋ช ๋ณดํธ (0) | 2022.04.11 |
---|---|
[JS] ํ๋ก๊ทธ๋๋จธ์ค ๊ฒ์ ๋งต ์ต๋จ๊ฑฐ๋ฆฌ (0) | 2022.04.11 |
[Swift] ํ๋ก๊ทธ๋๋จธ์ค ์ฌ๋ฐ๋ฅธ ๊ดํธ์ ๊ฐฏ์ (0) | 2022.03.06 |
[Swift] 2019 KAKAO WINTER INTERNSHIP ํธํ ๋ฐฉ ๋ฐฐ์ (0) | 2022.02.20 |
[JS] ํ๋ก๊ทธ๋๋จธ์ค 124 ๋๋ผ์ ์ซ์ (0) | 2022.02.14 |
๋๊ธ