λ°±μ€ - ν±νν (Swift)
λ°±μ€ - ν±νν (Swift)
λ¬Έμ μ€λͺ
https://www.acmicpc.net/problem/7682
7682λ²: ν±νν
ν±νν κ²μμ λ λͺ μ μ¬λμ΄ λ²κ°μκ°λ©° λ§μ λλ κ²μμ΄λ€. κ²μνμ 3×3 격μνμ΄λ©°, μ²μμλ λΉμ΄ μλ€. λ μ¬λμ κ°κ° X λλ O λ§μ λ²κ°μκ°λ©° λλλ°, λ°λμ 첫 λ²μ§Έ μ¬λμ΄ Xλ₯Ό λκ³
www.acmicpc.net
λμ νμ΄
λ¬Έμ λ₯Ό λ³΄κ³ 3x3격μνμ΄λΌκ³ ν΄μ μ λ ₯κ°μμ 3x3ννλ‘ λ³΄λ 건κ°? μΆμλλ° νμ€λ‘ λ°λ κ²μ΄μλ€.
μκ°ν΄λ³΄λ©΄ νμ€λ§λ€ validμ¬λΆκ° μλλ° κ·Έκ±Έ λ³΄κ³ λΉ¨λ¦¬ νλ¨νμ΄μΌνλ€.
κ·Έλ¦¬κ³ λ¬Έμ λ μ΅μ’ μνμΈμ§λ₯Ό νλ³νλ κ²μ΄λ€.
μ¦ μ£Όμ΄μ§ ν±νν λ Xλ Oκ° μ΄κΈ΄μνλ‘ μΌμ° λλκ±°λ, λΉκΈ΄μνλ‘ Xκ° 5, Oκ° 4μΌλμ κ²½μ°λ§ Validκ° λλ κ²μ΄λ€.
κ·Έλμ Xκ° μ΄κ²Όμλ, Oκ° μ΄κ²Όμλ, λΉκ²Όμ λμΈμ§λ§ νλ¨νλ©΄ λλ€.
λ¨Όμ Xκ° μ΄κ²Όμλλ Xκ° λ¨Όμ λμκΈ° λλ¬Έμ Oλ³΄λ€ 1μ΄ λ§μΌλ©΄μ Xλ‘ νμ€μ λ§λ€κ³ Oλ‘ νμ€μ λͺ»λ§λ€μ΄μΌνλ€.
κ·Έλ¦¬κ³ Oκ° μ΄κ²Όμλλ Oκ° λ€μ λμμ§κΈ° λλ¬Έμ Xμ Oμ κ°μκ° κ°μμ§λμ΄λ©΄μ Xλ νμ€μ λͺ»λ§λ€κ³ Oλ νμ€μ λ§λλ μνμ΄λ€.
λ§μ§λ§μΌλ‘ λΉκ²Όμλλ κ²μμ΄ λλμνλ‘ Xκ° Oλ³΄λ€ 1λ§μ μνμ΄λ€.
μ΄λ₯Ό μν΄ checkν¨μλ₯Ό λ§λ€μ΄μ νμ€μ λ§λ€ μ μλ κ²½μ°λ₯Ό ꡬν μ μλλ‘ νλ€.
import Foundation
func checkOWin(_ map:[[String]]) -> Bool {
for i in 0..<3 { // κ°λ‘, μΈλ‘μ ν μ€μ΄ μμ±λλ©΄
if map[i][0] == "O", map[i][0] == map[i][1], map[i][1] == map[i][2] { return true }
if map[0][i] == "O", map[0][i] == map[1][i], map[1][i] == map[2][i] { return true }
}
// λκ°μ μ°μΈ‘λ°©ν₯μ νμ€μ΄ μμ±λλ©΄
if map[0][0] == "O", map[0][0] == map[1][1], map[1][1] == map[2][2] {
return true
}
// λκ°μ μ’μΈ‘λ°©ν₯μ νμ€μ΄ μμ±λλ©΄
if map[0][2] == "O", map[0][2] == map[1][1], map[1][1] == map[2][0] {
return true
}
return false
}
func checkXWin(_ map:[[String]]) -> Bool {
for i in 0..<3 {
if map[i][0] == "X", map[i][0] == map[i][1], map[i][1] == map[i][2] { return true }
if map[0][i] == "X", map[0][i] == map[1][i], map[1][i] == map[2][i] { return true }
}
if map[0][0] == "X", map[0][0] == map[1][1], map[1][1] == map[2][2] {
return true
}
if map[0][2] == "X", map[0][2] == map[1][1], map[1][1] == map[2][0] {
return true
}
return false
}
while true {
let input = readLine()!.map{String($0)}
if input[0] == "e" { // endκ° λμ€λ©΄ μ’
λ£
break
}
var map = [[String]](repeating: [String](repeating: ".", count: 3), count: 3)
var oNum = 0
var xNum = 0
for i in 0..<9 {
map[i/3][i%3] = input[i]
if input[i] == "O" { oNum += 1 } else if input[i] == "X" { xNum += 1}
}
let oWin = checkOWin(map)
let xWin = checkXWin(map)
if xWin, !oWin, xNum - oNum == 1 { // Xκ° μ΄κΈΈλλ Oλ³΄λ€ 1κ°λ§μ μν
print("valid")
} else if oWin, !xWin, xNum == oNum { // Oκ° μ΄κΈΈλλ Xμ Oμ κ°μκ° κ°μμν
print("valid")
} else if !oWin, !xWin, xNum == 5, oNum == 4 { // λΉκΈΈλλ Xκ° 5μ΄κ³ , Oκ° 4μΈμν
print("valid")
} else { // κ·Έ μΈλ λΆκ°λ₯
print("invalid")
}
}