๐ ์ฝ๋ฉํ ์คํธ
โ๐ป Github
๋ฌธ์ ์ค๋ช
๊ฒ์๊ฐ๋ฐ์์ธ "์ฃ ๋ฅด๋"๋ ํฌ๋ ์ธ ์ธํ๋ฝ๊ธฐ ๊ธฐ๊ณ๋ฅผ ๋ชจ๋ฐ์ผ ๊ฒ์์ผ๋ก ๋ง๋ค๋ ค๊ณ ํฉ๋๋ค.
"์ฃ ๋ฅด๋"๋ ๊ฒ์์ ์ฌ๋ฏธ๋ฅผ ๋์ด๊ธฐ ์ํด ํ๋ฉด ๊ตฌ์ฑ๊ณผ ๊ท์น์ ๋ค์๊ณผ ๊ฐ์ด ๊ฒ์ ๋ก์ง์ ๋ฐ์ํ๋ ค๊ณ ํฉ๋๋ค.
๊ฒ์ ํ๋ฉด์ "1 x 1" ํฌ๊ธฐ์ ์นธ๋ค๋ก ์ด๋ฃจ์ด์ง "N x N" ํฌ๊ธฐ์ ์ ์ฌ๊ฐ ๊ฒฉ์์ด๋ฉฐ ์์ชฝ์๋ ํฌ๋ ์ธ์ด ์๊ณ ์ค๋ฅธ์ชฝ์๋ ๋ฐ๊ตฌ๋๊ฐ ์์ต๋๋ค. (์ ๊ทธ๋ฆผ์ "5 x 5" ํฌ๊ธฐ์ ์์์ ๋๋ค). ๊ฐ ๊ฒฉ์ ์นธ์๋ ๋ค์ํ ์ธํ์ด ๋ค์ด ์์ผ๋ฉฐ ์ธํ์ด ์๋ ์นธ์ ๋น์นธ์ ๋๋ค. ๋ชจ๋ ์ธํ์ "1 x 1" ํฌ๊ธฐ์ ๊ฒฉ์ ํ ์นธ์ ์ฐจ์งํ๋ฉฐ ๊ฒฉ์์ ๊ฐ์ฅ ์๋ ์นธ๋ถํฐ ์ฐจ๊ณก์ฐจ๊ณก ์์ฌ ์์ต๋๋ค. ๊ฒ์ ์ฌ์ฉ์๋ ํฌ๋ ์ธ์ ์ข์ฐ๋ก ์์ง์ฌ์ ๋ฉ์ถ ์์น์์ ๊ฐ์ฅ ์์ ์๋ ์ธํ์ ์ง์ด ์ฌ๋ฆด ์ ์์ต๋๋ค. ์ง์ด ์ฌ๋ฆฐ ์ธํ์ ๋ฐ๊ตฌ๋์ ์์ด๊ฒ ๋๋ ๋ฐ, ์ด๋ ๋ฐ๊ตฌ๋์ ๊ฐ์ฅ ์๋ ์นธ๋ถํฐ ์ธํ์ด ์์๋๋ก ์์ด๊ฒ ๋ฉ๋๋ค. ๋ค์ ๊ทธ๋ฆผ์ [1๋ฒ, 5๋ฒ, 3๋ฒ] ์์น์์ ์์๋๋ก ์ธํ์ ์ง์ด ์ฌ๋ ค ๋ฐ๊ตฌ๋์ ๋ด์ ๋ชจ์ต์ ๋๋ค.
๋ง์ฝ ๊ฐ์ ๋ชจ์์ ์ธํ ๋ ๊ฐ๊ฐ ๋ฐ๊ตฌ๋์ ์ฐ์ํด์ ์์ด๊ฒ ๋๋ฉด ๋ ์ธํ์ ํฐ๋จ๋ ค์ง๋ฉด์ ๋ฐ๊ตฌ๋์์ ์ฌ๋ผ์ง๊ฒ ๋ฉ๋๋ค. ์ ์ํ์์ ์ด์ด์ [5๋ฒ] ์์น์์ ์ธํ์ ์ง์ด ๋ฐ๊ตฌ๋์ ์์ผ๋ฉด ๊ฐ์ ๋ชจ์ ์ธํ ๋ ๊ฐ๊ฐ ์์ด์ง๋๋ค.
ํฌ๋ ์ธ ์๋ ์ ์ธํ์ด ์ง์ด์ง์ง ์๋ ๊ฒฝ์ฐ๋ ์์ผ๋ ๋ง์ฝ ์ธํ์ด ์๋ ๊ณณ์์ ํฌ๋ ์ธ์ ์๋์ํค๋ ๊ฒฝ์ฐ์๋ ์๋ฌด๋ฐ ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค. ๋ํ ๋ฐ๊ตฌ๋๋ ๋ชจ๋ ์ธํ์ด ๋ค์ด๊ฐ ์ ์์ ๋งํผ ์ถฉ๋ถํ ํฌ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. (๊ทธ๋ฆผ์์๋ ํ๋ฉดํ์ ์ ์ฝ์ผ๋ก 5์นธ๋ง์ผ๋ก ํํํ์์)
๊ฒ์ ํ๋ฉด์ ๊ฒฉ์์ ์ํ๊ฐ ๋ด๊ธด 2์ฐจ์ ๋ฐฐ์ด board์ ์ธํ์ ์ง๊ธฐ ์ํด ํฌ๋ ์ธ์ ์๋์ํจ ์์น๊ฐ ๋ด๊ธด ๋ฐฐ์ด moves๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ํฌ๋ ์ธ์ ๋ชจ๋ ์๋์ํจ ํ ํฐํธ๋ ค์ ธ ์ฌ๋ผ์ง ์ธํ์ ๊ฐ์๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
[์ ํ์ฌํญ]
- board ๋ฐฐ์ด์ 2์ฐจ์ ๋ฐฐ์ด๋ก ํฌ๊ธฐ๋ "5 x 5" ์ด์ "30 x 30" ์ดํ์ ๋๋ค.
- board์ ๊ฐ ์นธ์๋ 0 ์ด์ 100 ์ดํ์ธ ์ ์๊ฐ ๋ด๊ฒจ์์ต๋๋ค.
- 0์ ๋น ์นธ์ ๋ํ๋ ๋๋ค.
- 1 ~ 100์ ๊ฐ ์ซ์๋ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ธํ์ ๋ชจ์์ ์๋ฏธํ๋ฉฐ ๊ฐ์ ์ซ์๋ ๊ฐ์ ๋ชจ์์ ์ธํ์ ๋ํ๋ ๋๋ค.
- moves ๋ฐฐ์ด์ ํฌ๊ธฐ๋ 1 ์ด์ 1,000 ์ดํ์ ๋๋ค.
- moves ๋ฐฐ์ด ๊ฐ ์์๋ค์ ๊ฐ์ 1 ์ด์์ด๋ฉฐ board ๋ฐฐ์ด์ ๊ฐ๋ก ํฌ๊ธฐ ์ดํ์ธ ์์ฐ์์ ๋๋ค.
์ ์ถ๋ ฅ ์
board | moves | result |
[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] | [1,5,3,5,1,2,1,4] | 4 |
์ ์ถ๋ ฅ ์์ ๋ํ ์ค๋ช
์ ์ถ๋ ฅ ์ #1
์ธํ์ ์ฒ์ ์ํ๋ ๋ฌธ์ ์ ์ฃผ์ด์ง ์์์ ๊ฐ์ต๋๋ค. ํฌ๋ ์ธ์ด [1, 5, 3, 5, 1, 2, 1, 4] ๋ฒ ์์น์์ ์ฐจ๋ก๋๋ก ์ธํ์ ์ง์ด์ ๋ฐ๊ตฌ๋์ ์ฎ๊ฒจ ๋ด์ ํ, ์ํ๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ผ๋ฉฐ ๋ฐ๊ตฌ๋์ ๋ด๋ ๊ณผ์ ์์ ํฐํธ๋ ค์ ธ ์ฌ๋ผ์ง ์ธํ์ 4๊ฐ ์ ๋๋ค.
๋ฌธ์ ํ์ด
๋์ ํ์ด
import Foundation
func solution(_ board:[[Int]], _ moves:[Int]) -> Int {
// board๋ฅผ ํ์ ๊ฐ์ key๋ก ๋ฐ์ Dictionary๋ก ์ ํ
var boardDic = [Int: [Int]]()
// moves์ ๋ฐ๋ฅธ ์ธํ ์ธ๋ฑ์ค๋ฅผ ๋ฃ์ ๋ฐฐ์ด
var stack = [Int]()
// ์ ๋ต
var count = 0
// board -> Dic
(0..<board.count).forEach{ i in
boardDic[i+1] = (0..<board.count).filter{ board[$0][i] != 0 }
.map{ board[$0][i] }
}
for move in moves {
var calum = boardDic[move] ?? []
guard let doll = calum.first else { continue }
calum.removeFirst()
boardDic[move] = calum
if ( stack.last ?? 0 ) == doll {
stack.removeLast()
count += 2
} else {
stack.append(doll)
}
}
return count
}
์ด์ ๋ ์ ๋ง ์ด๋ป๊ฒ ์ฝ๋ฉํ ์คํธ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ง๋ฅผ ๊ณ ๋ฏผํ๋ ์๊ฐ์ด ํธ๋ ์๊ฐ๋ณด๋ค ๋ ๊ธด ๊ฒ ๊ฐ๋ค. ๊ทธ๋งํผ ๋ด๊ฐ ๋จธ๋ฆฟ์์์ ๊ทธ๋ฆฌ๊ณ ์๋ ํ์ด ์์ฒด๋ฅผ ๋ฐ๋ก ๊ตฌํํ ์ ์๋ ์ฝ๋ฉ์ค๋ ฅ๋ ๋์ ๊ฒ ๊ฐ๊ณ , ์ด๋ป๊ฒ ํ๋ฉด ์๊ฐ ์ด๊ณผ๋ฅผ ๋ฒ์ด๋์ง ์์์ง ๊ณ ๋ฏผํ๋ ๋ถ๋ถ๋ ๊ฝค๋ ์ฑ์ฅํ ๊ฒ ๊ฐ๋ค.
์ด๋ฒ ๋ฌธ์ ๋ ๋ฉ๋ชจ์ฅ์์ ์์์์ ๋์๋ ์์ ๋ค์ ๋์์ ๋ฐ๋ผ๊ฐ๋ฉด์ ๋ด๊ฐ ์ด๋ค ๋ฐฉ์์ผ๋ก ๊ตฌํํด์ผํ ์ง ๊ณ ๋ฏผํ๋ค.
์๋ก์ด stack์ ๋ง๋ค์ด์ ๋ค์ด์ค๋ ์ธํ์ด ๋ฐ๋ก ์์ stack๊ณผ ๊ฐ๋ค๋ฉด ๋ฐ๋ก count๋ฅผ ์ฌ๋ฆฌ๊ณ , stack์์ ๋ง์ง๋ง ๋ฐฐ์ด์ ์ ๊ฑฐํ๋ฉด ๋๊ฒ ๋ค๊ณ ์๊ฐํ๊ณ , ํด๋นํ๋ ์ธํ์ ์ด์ ๋นผ์ค๋ ๋ถ๋ถ์์๋ ๋ฐฐ์ด๋ก ๋ค์ด๊ฐ๋ค๋ฉด ๋ฌด์กฐ๊ฑด ์๊ฐ์ด๊ณผ๊ฐ ๋์ฌ ๊ฒ์ด๋ผ๊ณ ์๊ฐํด์ ์์ ํ์ตํ๋ ์ ๊ณ ๊ฒฐ๊ณผ๋ฐ๊ธฐ์์์ ๋ฐฐ์ด์ ๋์ ๋๋ฆฌ์ value์ ๋ฃ์ด์ Dictionary๋ก search๋ฅผ ํ๋ค๋ฉด ๋ฐ๋ก ํ๋ฆฌ๊ฒ ๋ค๊ณ ์๊ฐํด์ ์คํํ์๋ค.
์๊ฐํ๋ ํ์ด๋๋ก ์ฐจ๊ทผ์ฐจ๊ทผ board๋ฅผ Dictionary์ ๋จผ์ ๋ฃ์ด์ ์คํํด๋ณด๊ณ ์๋ฒฝํ๊ฒ ๊ตฌํ์ด ๋์๋ค๋ฉด, ๋ค์ ๋จ๊ณ์ธ ํ์ ๊ฐ์ ๋ง๋ ์ธํ์ ๋นผ์ ๋ฐฐ์ด์์ ์์ ์ ๋์ ๋๋ฆฌ๋ฅผ ์ ๋ฐ์ดํธ ํด์ฃผ๊ณ , ๊ทธ ์ธํ๊ณผ stack์ ๋ง์ง๋ง ๋ถ๋ถ์ ๋น๊ตํ์ฌ count๋ฅผ ์ฌ๋ ค์ฃผ์๋ค.
์ฌ๊ธฐ์ ๊ทธ์น์ง ๋ง๊ณ ๋ค๋ฅธ ์ฌ๋๋ค์ ํ์ด๋๋ ๋น๊ตํด๋ณด์! ( ๊ทผ๋ฐ column ์คํ๋ฌ๋นใ )
๋ค๋ฅธ ์ฌ๋ ํ์ด
import Foundation
func solution(_ board:[[Int]], _ moves:[Int]) -> Int {
var count = 0
var stacks: [[Int]] = Array(repeating: [], count: board.count)
var bucket: [Int] = []
board.reversed().forEach {
$0.enumerated().forEach {
if $0.1 != 0 {
stacks[$0.0].append($0.1)
}
}
}
moves.forEach {
if let doll = stacks[$0-1].popLast() {
if let last = bucket.last, last == doll {
bucket.removeLast(1)
count += 2
} else {
bucket.append(doll)
}
}
}
return count
}
removeFirst()๋ณด๋ค ๋น ๋ฅธ popLast()๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ฐ์ ๋ฐฐ์ด์ ๋ค์ง์ด์ฃผ์๋ค.
๋ด๊ฐ Dictionary๋ก column์ ๋ฐ๋ผ ๋ค์ ์ธํ๋ค์ ๋ฃ์ด์ค ๋ถ๋ถ์ ์ด ๋ถ์ ๋ฐฐ์ด๋ก ์ ๋ฆฌ๋ฅผ ํ์๋ค.
์ฝ๋๋ ํจ์ฌ ๊น๋ํ๊ณ ๊ฐ๊ฒฐํ๋ค. ์คํ์๊ฐ์ ๋น๊ตํด๋ณด์.
๋์ ํ์ด ์คํ์๊ฐ
ํ
์คํธ 1 ใ ํต๊ณผ (0.27ms, 16.7MB)
ํ
์คํธ 2 ใ ํต๊ณผ (0.18ms, 16.5MB)
ํ
์คํธ 3 ใ ํต๊ณผ (0.17ms, 16.4MB)
ํ
์คํธ 4 ใ ํต๊ณผ (1.79ms, 16.6MB)
ํ
์คํธ 5 ใ ํต๊ณผ (0.17ms, 16.4MB)
ํ
์คํธ 6 ใ ํต๊ณผ (0.23ms, 16.3MB)
ํ
์คํธ 7 ใ ํต๊ณผ (0.52ms, 16.6MB)
ํ
์คํธ 8 ใ ํต๊ณผ (0.66ms, 16.3MB)
ํ
์คํธ 9 ใ ํต๊ณผ (0.67ms, 16.5MB)
ํ
์คํธ 10 ใ ํต๊ณผ (0.73ms, 16.6MB)
ํ
์คํธ 11 ใ ํต๊ณผ (1.29ms, 16.6MB)
๋ค๋ฅธ์ฌ๋์ ํ์ด ์คํ์๊ฐ
ํ
์คํธ 1 ใ ํต๊ณผ (0.15ms, 16.5MB)
ํ
์คํธ 2 ใ ํต๊ณผ (0.17ms, 16.6MB)
ํ
์คํธ 3 ใ ํต๊ณผ (0.16ms, 16.5MB)
ํ
์คํธ 4 ใ ํต๊ณผ (0.65ms, 16.6MB)
ํ
์คํธ 5 ใ ํต๊ณผ (0.22ms, 16.4MB)
ํ
์คํธ 6 ใ ํต๊ณผ (0.16ms, 16.5MB)
ํ
์คํธ 7 ใ ํต๊ณผ (0.23ms, 16.5MB)
ํ
์คํธ 8 ใ ํต๊ณผ (0.65ms, 16.5MB)
ํ
์คํธ 9 ใ ํต๊ณผ (0.35ms, 16.5MB)
ํ
์คํธ 10 ใ ํต๊ณผ (0.36ms, 16.5MB)
ํ
์คํธ 11 ใ ํต๊ณผ (0.56ms, 16.6MB)
๋์ ํ์ด๊ฐ ๋ ๋๋ฆฐ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ๊ฐ์ ์ฐพ๋ ๊ฒ์ ๋ฌด์กฐ๊ฑด Dictionary๊ฐ ๋น ๋ฅผ ๊ฒ์ด๋ผ๋ ๋ด ์๊ฐ์ด ํ๋ฆฐ ๊ฒ์ด๋ค. ์ ๋ค๋ฅธ ์ฌ๋์ ํ์ด๊ฐ ๋ ๋น ๋ฅธ์ง ๋ถ์์ ํด๋ณด๋ฉด, ๋์ ๋๋ฆฌ๋ ๊ฐ์ ์์นํ๋ ๋ฐ๋ ๋น ๋ฅด์ง๋ง ๋ฐฐ์ด๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ ๋ง๋ค. ๋ฐฐ์ด์ ๊ฐ์ append ํ๊ฑฐ๋ pop ํ๋ ์๊ฐ๋ณด๋ค ๋์ ๋๋ฆฌ์์ ๋ฐฐ์ด์ ๊ฐ์ ธ์์ removeFirst()๋ฅผ ์งํํ๋ค์ ๋ค์ ๋์ ๋๋ฆฌ๋ฅผ ์๋กญ๊ฒ ์ ๋ฐ์ดํธ ํด์ฃผ๋ ๊ณผ์ ์ด ๋ ๋๋ฆฌ๊ฒ ๋ ๊ฒ์ด ์๋๊ฐ๋ผ๋ ์๊ฐ์ ํ๊ฒ ๋์๋ค!
์ด๋ก์จ ์ค๋์ ๋ฐฐ์.
๋ฌด์กฐ๊ฑด ๋์ ๋๋ฆฌ๊ฐ ์๋ ๋๋ ์๋ค๋ ๊ฒ!