경우의 수를 잘 나누면 된다.
특별한 알고리즘은 딱히 없었다.
class Solution {
public int solution(String[] board) {
int Ocnt = 0;
int Xcnt = 0;
//O와 X의 개수를 센다.
for (int i = 0; i < 3; i++) {
Ocnt += countChar(board[i], 'O');
Xcnt += countChar(board[i], 'X');
}
//'X'가 'O'보다 많으면 규칙 위반
if (Xcnt > Ocnt) {
return 0;
}
//'O'가 'X'보다 2개이상 많으면 규칙 위반
if (Ocnt > Xcnt + 1) {
return 0;
}
//O가 완성 되었을 때 X가 O의 개수와 같으면 규칙 위반
if (hasWin(board, 'O')) {
if (Ocnt == Xcnt) {
return 0;
}
}
//X가 완성 되었을 때 O가 X보다 1개 많으면 규칙 위반
if (hasWin(board, 'X')) {
if (Ocnt == Xcnt + 1) {
return 0;
}
}
return 1;
}
private static int countChar(String str, char ch) {
return str.length() - str.replace(String.valueOf(ch), "").length();
}
private static boolean hasWin(String[] board, char ch) {
//가로 검사
for (int i = 0; i < 3; i++) {
if (board[i].charAt(0) == ch
&& board[i].charAt(1) == ch
&& board[i].charAt(2) == ch) {
return true;
}
}
//세로 검사
for (int i = 0; i < 3; i++) {
if (board[0].charAt(i) == ch
&& board[1].charAt(i) == ch
&& board[2].charAt(i) == ch) {
return true;
}
}
//대각선 검사
if (board[0].charAt(0) == ch
&& board[1].charAt(1) == ch
&& board[2].charAt(2) == ch) {
return true;
}
if (board[0].charAt(2) == ch
&& board[1].charAt(1) == ch
&& board[2].charAt(0) == ch) {
return true;
}
return false;
}
}
반응형
'알고리즘' 카테고리의 다른 글
프로그래머스 - 둘만의 암호 (0) | 2024.08.13 |
---|---|
프로그래머스 - 무인도 여행 (0) | 2024.08.13 |
프로그래머스 - 미로탈출 (0) | 2024.08.12 |
프로그래머스 - 카드뭉치 (0) | 2024.08.12 |
프로그래머스 - 대충 만든 자판 (0) | 2024.08.11 |
프로그래머스 - 리코쳇 로봇 (0) | 2024.08.11 |
프로그래머스 - 신고 결과 받기 (0) | 2022.03.21 |
1이 될때까지 최소 연산 횟수 (0) | 2021.08.21 |