💬 문제
혼자서 하는 틱택토
💬 Idea
- 머쓱이가 실수할 법한 경우의 수를 생각하자
- OX의 수가 잘못된 경우
- X(후공)의 개수가 O(선공)의 개수보다 많을 경우
- O(선공)의 개수가 X(후공)의 개수보다 많지만 차례로 번갈아가면서 놓지 않고 O(선공)가 더 많이 놓은 경우
- 종료 상황인데 끝나지 않은 경우 == 가로, 세로, 대각선으로 3개가 같은 표시가 만들어졌는데 끝나지 않은 경우
이 경우를 위해서 3x3의 보드를 0, 1, 2, 3, 4, 5, 6, 7, 8의 정수값을 가지는 숫자판으로 가정한다.
- bingoArr에 미리 계산해둔 bingo의 가능성을 정수 배열로 저장해둔다.
가로 : [0,1,2], [3,4,5], [6,7,8]대각선 : [0,4,8], [2,4,6]세로 : [0,3,6], [1,4,7], [2,5,8]
O, X가 나올때마다 각각의 좌표를 정수로 변환하여 oBoard, xBoard에 append해주었다.
이후 oBoard, xBoard의 수가 각각 3을 넘어갈 경우 미리 계산해둔 bingo의 가능성이 저장되어있는 bingoArr를 차례로 돌면서 bingo가 되었을 때 게임이 종료됨을 알리는 isOXEnd 변수의 값을 true로 바꾸고 반복문을 탈출한다.
💬 풀이
func solution(board:[String])->Int{varoxCount=(0,0)varoBoard:[Int]=[]varxBoard:[Int]=[]varisOXEnd=(false,false)letbingoArr=[[0,1,2],[3,4,5],[6,7,8],[0,4,8],[2,4,6],[0,3,6],[1,4,7],[2,5,8]]for(bdx, b)in board.enumerated(){for(tdx, t)in b.enumerated(){if t =="O"{
oxCount.0+=1
// 보드의 좌표값이 아닌 정수로 0, 1, 2, 3, 4, 5, 6, 7, 8
oBoard.append((bdx *3)+ tdx)}elseif t =="X"{
oxCount.1+=1
xBoard.append((bdx *3)+ tdx)}if oBoard.count >=3{forain bingoArr {if oBoard.count - oBoard.filter({ !a.contains($0)}).count ==3{
isOXEnd.0=truebreak}}}if xBoard.count >=3{forain bingoArr {if xBoard.count - xBoard.filter({ !a.contains($0)}).count ==3{
isOXEnd.1=truebreak}}}}}
// 조건 판별
return oxCount.0< oxCount.1 || oxCount.0> oxCount.1+1 || (oxCount.0<= oxCount.1 && isOXEnd.0) || (oxCount.0> oxCount.1 && isOXEnd.1)?0:1}
💬 문제혼자서 하는 틱택토
💬 Idea이 경우를 위해서 3x3의 보드를 0, 1, 2, 3, 4, 5, 6, 7, 8의 정수값을 가지는 숫자판으로 가정한다.
가로: [0,1,2], [3,4,5], [6,7,8]대각선: [0,4,8], [2,4,6]세로: [0,3,6], [1,4,7], [2,5,8]O, X가 나올때마다 각각의 좌표를 정수로 변환하여 oBoard, xBoard에 append해주었다.
이후 oBoard, xBoard의 수가 각각 3을 넘어갈 경우 미리 계산해둔 bingo의 가능성이 저장되어있는 bingoArr를 차례로 돌면서 bingo가 되었을 때 게임이 종료됨을 알리는 isOXEnd 변수의 값을 true로 바꾸고 반복문을 탈출한다.
💬 풀이