https://school.programmers.co.kr/learn/courses/30/lessons/160585
실수를 했을수도있지만 규칙을 지켜서 진행했으면 1
못지킨 경우 0
규칙
혼자서 선공 후공 둘다
선공 O
후공 X
가장 큰 쟁점 -> 규칙을 지켰는가?
맵크기는 3*3 고정
큰쟁점
불가능한경우
전체 판이 X만 있는경우
"O"를 표시할 차례인데 "X"를 표시하거나 반대로 "X"를 표시할 차례인데 "O"를 표시한다.
선공이나 후공이 승리했는데 추가 진행된 경우 실수
이 경우를 체크하면될듯?
승리 조건 -> 가로 세로 대각선 중 같은 표시 3개인경우 승리
row = 0 col = 0 인경우 -> 가로 세로 대각 전부 체크
row = 1 col = 0 인경우 -> 가로 만체크
불가능 한경우 를 전부 체크해주면 되는 문제.
//X는 있는데 O가 없는경우 -> 실수
if (O_sum == 0 && X_sum >= 1) {
return 0;
}
//X가 더 많으면 아웃
if(X_sum > O_sum)
return 0;
//둘의 차이가 2이상인경우 -> 실수
if (O_sum - X_sum >= 2) {
return 0;
}
checkMap();
//둘다 승리한경우 -> 불가능
if (WinO && WinX) {
return 0;
}
//O가 승리 했을때 둘의 개수가 같은경우 실수
if(WinO && O_sum == X_sum)
return 0;
//X가 완성됬을때 O가 하나더 있는경우 -> 끝나고도 진행됬음
if(WinX && O_sum - X_sum >= 1)
return 0;
구현
class Solution {
char map[][];
int X_sum = 0;
int O_sum = 0;
boolean WinO = false;
boolean WinX = false;
public int solution(String[] board) {
int answer = -1;
map = new char[3][3];
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 3; col++) {
char cur = board[row].charAt(col);
map[row][col] = cur;
if (cur == 'X') {
X_sum += 1;
} else if (cur == 'O') {
O_sum += 1;
}
}
}
answer = isPossible();
return answer;
}
private int isPossible() {
//X는 있는데 O가 없는경우 -> 실수
if (O_sum == 0 && X_sum >= 1) {
return 0;
}
//X가 더 많으면 아웃
if(X_sum > O_sum)
return 0;
//둘의 차이가 2이상인경우 -> 실수
if (O_sum - X_sum >= 2) {
return 0;
}
checkMap();
//둘다 승리한경우 -> 불가능
if (WinO && WinX) {
return 0;
}
if(WinO && O_sum == X_sum)
return 0;
//X가 완성됬을때 O가 하나더 있는경우 -> 끝나고도 진행됬음
if(WinX && O_sum - X_sum >= 1)
return 0;
return 1;
}
//가로 3개
//세로 3개
//대각 2개
private void checkMap() {
//가로 체크
for (int row = 0; row < 3; row++) {
int cnt = 1;
char cur = map[row][0];
if (cur == '.')
continue;
for (int col = 1; col < 3; col++) {
if (cur == map[row][col]) {
cnt += 1;
} else {
break;
}
}
if (cnt == 3 && cur == 'O') {
WinO = true;
} else if (cnt == 3 && cur == 'X') {
WinX = true;
}
}
//세로 체크
for (int col = 0; col < 3; col++) {
int cnt = 1;
char cur = map[0][col];
if(cur == '.')
continue;
for (int row = 1; row < 3; row++) {
if (cur == map[row][col]) {
cnt += 1;
} else {
break;
}
}
if (cnt == 3 && cur == 'O') {
WinO = true;
} else if (cnt == 3 && cur == 'X') {
WinX = true;
}
}
//대각 체크 2가지
char cur = map[0][0];
if (cur != '.') {
if (cur == map[1][1] && cur == map[2][2]) {
if(cur == 'O'){
WinO = true;
}else if(cur == 'X'){
WinX = true;
}
}
}
cur = map[0][2];
if(cur != '.'){
if(cur == map[1][1] && cur == map[2][0]){
if(cur == 'O'){
WinO = true;
}if(cur == 'X'){
WinX = true;
}
}
}
}
}