코테
[java] 프로그래머스스쿨 혼자서 하는 틱택토
상똥
2024. 9. 16. 19:08
풀이 |
1. O의 개수를 O_num, X의 개수를 X_num으로 선언한다. 초기값은 0 2. 이중 배열 map에 틱택토를 그린다 - 그려가며 각 문자의 수를 기록한다 3. 존재할 수 없는 경우의 수를 기록한다 - O가 X보다 적은 경우 (O가 선공이므로, O가 더 적은 경우는 존재할 수 없다) - O가 X보다 2개 이상 많은 경우 (번갈아가면서 해야하므로 최대 1만 차이날 수 있다) - O와 X가 동일하면서, O가 세 개 연속 존재하는 경우 (O가 이미 이겼음에도 이미 경기를 이어갔다는 것을 의미) - O와 X보다 한 개 더 많으면서, X가 세 개 연속 존재하는 경우 (X가 이미 이겼음에도 이미 경기를 이어갔다는 것을 의미) 4. 위의 경우 중 하나에 걸리면 return 0, 아니면 return 1 |
회고 |
이런 문제는 머리를 잘 굴려서 경우의 수를 차분히 생각해보아야 한다 |
코드 (접은 글) |
더보기
import java.util.*;
class Solution {
public int solution(String[] board) {
int O_num = 0;
int X_num = 0;
String[][] map = new String[3][3];
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++) {
String temp = board[i].substring(j, j + 1);
if (temp.equals("O")) O_num++;
else if(temp.equals("X")) X_num++;
map[i][j] = temp;
}
// O > X+1 이거나, O < X인 경우
if((O_num > X_num + 1) || (O_num < X_num)) return 0;
// 개수가 같은 경우 : O 세 개 연속만 아니면 통과
else if(O_num == X_num){
if(increaseRow(map, "O") == 0) return 0;
else if(increaseCol(map, "O") == 0) return 0;
else if(increaseRowAndCol1(map, "O") == 0) return 0;
else if(increaseRowAndCol2(map, "O") == 0) return 0;
return 1;
}
// O == X+1인 경우 : X 세 개 연속만 아니면 통과
else if(O_num > X_num) {
if(increaseRow(map, "X") == 0) return 0;
else if(increaseCol(map, "X") == 0) return 0;
else if(increaseRowAndCol1(map, "X") == 0) return 0;
else if(increaseRowAndCol2(map, "X") == 0) return 0;
return 1;
}
return 1;
}
private int increaseRow(String[][] map, String temp) {
for(int i = 0; i < 3; i++)
if(temp.equals(map[0][i]) && temp.equals(map[1][i]) && temp.equals(map[2][i])) return 0;
return 1;
}
private int increaseCol(String[][] map, String temp) {
for(int i = 0; i < 3; i++)
if(temp.equals(map[i][0]) && temp.equals(map[i][1]) && temp.equals(map[i][2])) return 0;
return 1;
}
private int increaseRowAndCol1(String[][] map, String temp) {
if(temp.equals(map[0][0]) && temp.equals(map[1][1]) && temp.equals(map[2][2])) return 0;
else return 1;
}
private int increaseRowAndCol2(String[][] map, String temp) {
if(temp.equals(map[2][0]) && temp.equals(map[1][1]) && temp.equals(map[0][2])) return 0;
else return 1;
}
}