프로그래머스 혼자서 하는 틱택토 JavaScript
2023년 2월 25일
문제 풀이
머쓱이가 혼자서 틱택톡을 할 때, 규칙을 어기는 실수를 했는지 확인하는 문제
규칙:
- "O"를 표시할 차례인데 "X"를 표시하거나 반대로 "X"를 표시할 차례인데 "O"를 표시한다.
- 선공이나 후공이 승리해서 게임이 종료되었음에도 그 게임을 진행한다.
이기는 조건은 가로, 세로, 대각선 중에 3개가 같은 표시가 만들어지는 것이다. 이겼는지 확인을 하기 위해 세로 방향을 확인하는 배열 x_arr
, 가로 방향을 확인하는 배열 y_arr
, 대각선을 확인하는 배열 slash_arr
을 선언한다.
게임판의 정보를 위치에 맞게 배열들에 넣어주고 'O', 'X'의 개수를 구한다.
그다음 x_arr
, y_arr
, slash_arr
을 조회해 이겼는지 확인한다.(oWin = true
'O' 승리, xWin = true
'X' 승리)
정상적이지 않은 틱택톡의 조건
- O의 개수 < X의 개수
- O의 개수 - X의 개수 > 1
- O와 X 모두 승리한 경우
- O가 승리했을 때, O가 X보다 한 개 더 많지 않은 경우
- X가 승리했을 때, X와 O의 개수가 같지 않은 경우
해당 조건에 걸리면 정상적이지 않으므로 0을 리턴하고 조건에 걸리지 않으면 1을 리턴한다.
solution.js
function solution(board) {
const board_arr = board.map((board) => board.split(''));
const winCheck = (arr) => {
let oCnt = 0, xCnt = 0, oWin = false, xWin = false;
const y_arr = new Array(3).fill(0).map(() => new Array());
const x_arr = new Array(3).fill(0).map(() => new Array());
const slash_arr = new Array(3).fill(0).map(() => new Array());
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
if (arr[i][j] === 'O') {
oCnt++;
} else if (arr[i][j] === 'X') {
xCnt++;
}
// 가로 방향
y_arr[i].push(arr[i][j]);
// 세로 방향
x_arr[j].push(arr[i][j]);
// 왼쪽에서 오른쪽 대각선
if (i === j) {
slash_arr[0].push(arr[i][j]);
}
// 오른쪽에서부터 왼쪽 대각선
if (i + j === 2) {
slash_arr[1].push(arr[i][j]);
}
}
}
for (let i = 0; i < 3; i++) {
if (
y_arr[i].filter(x => x === 'O').length === 3
|| x_arr[i].filter(x => x === 'O').length === 3
|| slash_arr[i].filter(x => x === 'O').length === 3
) {
oWin = true;
}
if (
y_arr[i].filter(x => x === 'X').length === 3
|| x_arr[i].filter(x => x === 'X').length === 3
|| slash_arr[i].filter(x => x === 'X').length === 3
) {
xWin = true;
}
}
const diff = oCnt - xCnt;
if (
diff < 0
|| diff > 1
|| (oWin && xWin)
|| (oWin && diff !== 1)
|| (xWin && diff !== 0)
) {
return 0;
}
return 1;
}
return winCheck(board_arr);
}