728x90
728x90
문제
접근 방법
현재까지 진행한 게임의 결과가 주어지고, 규칙을 위반한 적이 있는지 판단하는 문제다.
간단한 구현 문제다.
규칙을 위반하지 않고 나올 수 없는 경우를 체크해주면 된다.
풀이
- O 의 개수와 X 의 개수를 센다. - countChar()
- replace 함수를 사용하여 문자열의 길이 변화를 계산한다.
- 기존 문자열 길이와 replace한 문자열 길이의 차이만큼 O 또는 X가 존재한다.
- 4가지 경우의 규칙 위반을 검사한다.
- X 가 O 보다 많을 경우
- O가 선공이므로 규칙 위반이다.
- O 가 X 보다 2개 이상 많을 경우
- 1번씩 번갈아 진행하지 않은 규칙 위반이다.
- O가 완성되었을 때 X가 O와 같은 경우
- O가 완성되고 종료되지 않았으므로 규칙 위반이다.
- X가 완성되었을 때 O가 X보다 1개 많은 경우
- X가 완성되고 종료되지 않았으므로 규칙 위반이다.
- X 가 O 보다 많을 경우
- 규칙 위반이 발생했으면 0을, 발생하지 않았으면 1을 반환한다.
코드
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;
}
}
728x90
728x90
'Algorithm Practice > Programmers' 카테고리의 다른 글
[JAVA/자바][프로그래머스 181893] 배열 조각하기 (0) | 2023.04.21 |
---|---|
[JAVA/자바][프로그래머스 12946] 하노이의 탑 (0) | 2023.04.19 |