코딩테스트/Java
[programmers/java] 혼자서 하는 틱택토 - 시뮬레이션
zyin
2025. 6. 19. 07:52
문제 설명
- url : https://school.programmers.co.kr/learn/courses/30/lessons/160585
입력은 3×3 크기의 문자열 배열로, 각 칸에는 'O', 'X', '.' 중 하나가 들어간다. 이때 해당 보드 상태가 규칙에 어긋나지 않는지 확인하여 유효하면 1, 불가능한 상태면 0을 반환해야 한다.
게임 규칙 요약
- 'O'가 선공이다.
- 한 번에 한 개의 돌만 둘 수 있다.
- 'O'의 개수는 'X'보다 같거나 하나 더 많아야 한다.
- 누군가 승리했다면 게임은 종료되어야 하며, 이후의 착수는 존재할 수 없다.
- 'O'와 'X'가 동시에 이긴 상태는 존재할 수 없다.
풀이 전략
- 보드에서 'O'와 'X'의 개수를 센다.
- 개수 조건을 위반하면 바로 0을 반환한다.
- 각각의 플레이어가 승리했는지 판별한다.
- 승리 조건과 개수 조건이 서로 충돌하지 않는지 확인한다.
- 모든 조건을 만족하면 1을 반환한다.
주요 코드
public int solution(String[] board) {
int oCount = 0, xCount = 0;
for (String row : board) {
for (char c : row.toCharArray()) {
if (c == 'O') oCount++;
else if (c == 'X') xCount++;
}
}
if (xCount > oCount || oCount - xCount > 1) return 0;
boolean oWin = isWin(board, 'O');
boolean xWin = isWin(board, 'X');
if (oWin && xWin) return 0;
if (oWin && oCount != xCount + 1) return 0;
if (xWin && oCount != xCount) return 0;
return 1;
}
승리 조건 판별 함수
public boolean isWin(String[] board, char player) {
for (int i = 0; i < 3; i++) {
if (board[i].charAt(0) == player &&
board[i].charAt(1) == player &&
board[i].charAt(2) == player) return true;
if (board[0].charAt(i) == player &&
board[1].charAt(i) == player &&
board[2].charAt(i) == player) return true;
}
if (board[0].charAt(0) == player &&
board[1].charAt(1) == player &&
board[2].charAt(2) == player) return true;
if (board[0].charAt(2) == player &&
board[1].charAt(1) == player &&
board[2].charAt(0) == player) return true;
return false;
}