Algorithm/Programmers
160585. 혼자하는 틱택토
사랑우주인
2025. 3. 27. 21:22
문제
https://school.programmers.co.kr/learn/courses/30/lessons/160585
제한 사항

풀이
class Solution {
public int solution(String[] board) {
int answer = -1;
int oCnt = 0;
int xCnt = 0;
for(int i = 0 ; i< 3;i++)
for(int j = 0 ; j < 3 ; j++) {
if(board[i].charAt(j) == 'O')
oCnt++;
else if(board[i].charAt(j) == 'X')
xCnt++;
}
// O가 선공이기 때문에 X는 O보다 많을 수 없다.
// O는 X보다 많을 수 있지만 1개를 넘길 수 없다.
if(xCnt > oCnt || oCnt-xCnt >1)
return 0;
// O가 이기는 수
boolean isOWin = checkWin(board, 'O');
// X가 이기는 수
boolean isXWin = checkWin(board, 'X');
// O가 이겼는데 O와 X의 수가 동일할 수 없다.
if(isOWin && oCnt == xCnt) return 0;
// X가 이겼는데 O가 X의 수보다 많을 수 없다.
if(isXWin && oCnt > xCnt) return 0;
return 1;
}
boolean checkWin(String[] board, char p) {
// 가로
for(int i = 0 ; i < 3 ; i++) {
if(board[i].charAt(0) == p && board[i].charAt(1) == p && board[i].charAt(2) == p)
return true;
}
// 세로
for(int i = 0 ; i < 3 ; i++) {
if(board[0].charAt(i) == p && board[1].charAt(i) == p && board[2].charAt(i) == p)
return true;
}
// 대각선
if((board[0].charAt(0) == p && board[1].charAt(1) == p && board[2].charAt(2) == p) ||
(board[2].charAt(0) == p && board[1].charAt(1) == p && board[0].charAt(2) == p))
return true;
return false;
}
}
회고
게임에서 나올 수 없는 수가 있으면 0을 반환하고 그 외(게임에서 나올 가능성이 있는 수)는 1을 반환한다. 나올 수 없는 경우의 수가 더 적기 때문에 해당 경우를 필터링했다.
- O가 선공이기 때문에, O은 X보다 많을 수 있지만 1개를 넘을 수 없고, X는 O보다 많을 수 없다.
- O가 이길 경우, O가 선공이기 때문에 O는 반드시 X보다 많다. 정확히 말하면 O는 X보다 1개 더 많을 것이다.
- X가 이길 경우, X는 O와 개수가 동일할 것이다. O가 선공이기 때문에 X가 이긴 시점에서 O의 수는 X와 동일할 것이다.