Algorithm

λ°±μ€€ - 틱택토(Swift)

CheonD 2022. 11. 16. 17:16

λ°±μ€€ - ν‹±νƒν† (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")
    }
}