๋ฐฑ์ค€ - ํ‹ฑํƒํ† (Swift)

2022. 11. 16. 17:16ใ†Algorithm

๋ฐฑ์ค€ - ํ‹ฑํƒํ† (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")
    }
}