HIT해
[Swift/프로그래머스] 혼자서 하는 틱택토 ( 완전탐색 ) 본문
728x90
https://school.programmers.co.kr/learn/courses/30/lessons/160585
동일 난이도의 문제들에 비해 구현해야할 사항이 많을 뿐 문제의 난이도는 이게 맞나 싶었다.
처음에는 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
}
'Swift > Swift 알고리즘' 카테고리의 다른 글
[Swift/프로그래머스] 숫자 변환하기 ( 그리디 ) (0) | 2024.11.01 |
---|---|
[Swift/프로그래머스] 뒤에 있는 큰 수 찾기 ( 그리디 ) (0) | 2024.11.01 |
[Swift/프로그래머스] 리코쳇 로봇 (BFS) (0) | 2024.11.01 |
[Swift] DateFormatter (0) | 2024.11.01 |
[Swift/프로그래머스] 과제 진행하기 (?) (0) | 2024.11.01 |