HIT해

[Swift/프로그래머스] 혼자서 하는 틱택토 ( 완전탐색 ) 본문

Swift/Swift 알고리즘

[Swift/프로그래머스] 혼자서 하는 틱택토 ( 완전탐색 )

힛해 2024. 11. 1. 09:28
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/160585

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

동일 난이도의 문제들에 비해 구현해야할 사항이 많을 뿐 문제의 난이도는 이게 맞나 싶었다.

 

처음에는 O X 구분 없이 빙고가 2개 이상이 있을때 오류라고 판단했는데

O..

.O.

OOO

이 또한 한번에 나올 수 있는 경우임에도 오류라고 판단해서 틀렸었다.

 

풀이

import Foundation
func solution(_ board:[String]) -> Int {
    
    var map = [[Character]](repeating:[],count:3)
    
    for i in 0..<3 {
        map[i] = Array(board[i])
    }
    
    var oCount = 0
    var xCount = 0
    
    for i in 0...2{
        for j in 0...2{
            let tmp : Character = map[i][j]
            if tmp == "O" {
                oCount += 1
            }else if tmp == "X"{
                xCount += 1
            }
        }
    }
    
    let diff = oCount - xCount
    if diff < 0 || diff > 1 {
        return 0
    }
    
    // 함수들은 그대로 유지
    func checkBingo1(x : Int, y : Int , check : Character) -> Bool {
        if map[x+1][y] == check && map[x+2][y] == check {
            return true
        }else{
            return false
        }
    }
    
    func checkBingo2(x : Int, y : Int , check : Character) -> Bool {
        if map[x][y+1] == check && map[x][y+2] == check {
            return true
        }else{
            return false
        }
    }
    
    func checkBingo3(x : Int, y : Int , check : Character) -> Bool {
        if map[x+1][y+1] == check && map[x+2][y+2] == check {
            return true
        }else{
            return false
        }
    }
    
    func checkBingo4(x : Int, y : Int , check : Character) -> Bool {
        if map[x+1][y-1] == check && map[x+2][y-2] == check {
            return true
        }else{
            return false
        }
    }
    
    var oBingoCount = 0
    var xBingoCount = 0
    
    // 세로 빙고 체크
    for i in 0...2 {
        if map[0][i] == "O" && checkBingo1(x: 0, y: i, check: "O") {
            oBingoCount += 1
        }
        if map[0][i] == "X" && checkBingo1(x: 0, y: i, check: "X") {
            xBingoCount += 1
        }
    }
    
    // 가로 빙고 체크
    for i in 0...2 {
        if map[i][0] == "O" && checkBingo2(x: i, y: 0, check: "O") {
            oBingoCount += 1
        }
        if map[i][0] == "X" && checkBingo2(x: i, y: 0, check: "X") {
            xBingoCount += 1
        }
    }
    
    // 대각선 체크
    if map[0][0] == "O" && checkBingo3(x: 0, y: 0, check: "O") {
        oBingoCount += 1
    }
    if map[0][0] == "X" && checkBingo3(x: 0, y: 0, check: "X") {
        xBingoCount += 1
    }
    
    // 역대각선 체크
    if map[0][2] == "O" && checkBingo4(x: 0, y: 2, check: "O") {
        oBingoCount += 1
    }
    if map[0][2] == "X" && checkBingo4(x: 0, y: 2, check: "X") {
        xBingoCount += 1
    }
    
    // O가 이겼을 때는 O가 X보다 1개 많아야 함
    if oBingoCount > 0 && diff != 1 {
        return 0
    }
    
    // X가 이겼을 때는 O와 X의 개수가 같아야 함
    if xBingoCount > 0 && diff != 0 {
        return 0
    }
    
    // O와 X가 동시에 이길 수 없음
    if oBingoCount > 0 && xBingoCount > 0 {
        return 0
    }
    
    return 1
}