🧫 문제 분석
✔️ 출처
📖 문제

단순 구현 문제인듯 하다.
간단하다. 머쓱이가 잘못 둔것과 별개로 그저 현재 주어진 게임판이 나올수 있는 게임 상황인지 아닌지만 판단하면 된다.
내가 생각했을 때 나올 수 없는 상황을 생각해봤다.
나올 수 없는 상황
- O의 개수 - 2 >= X 개수
- O의 개수 < X 개수
- O가 빙고했는데 X의 개수가 O와 같거나 클때
- X가 빙고했는데 O의 개수가 클때
O 빙고가 우선권을 가짐 (O 빙고와 X빙고 둘다 있을 경우)
처음 O와 X의 개수를 구하고 위 2가지 경우에 대해서 체크한다음 이상이 없다면
가로, 세로, 대각선 빙고를 체크해서 아래 2가지 경우에 대해서 체크한다.
🔅 문제 풀이
class Solution {
// 나올 수 없는 상황
// O의 개수 - 2 >= X 개수
// O의 개수 < X 개수
// O가 빙고했는데 X의 개수가 O와 같거나 클때
// X가 빙고했는데 O의 개수가 클때
// O 빙고가 우선권을 가짐
public int solution(String[] board) {
int answer = 1;
// O와 X의 개수 카운트
int countO = 0;
int countX = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[i].charAt(j) == 'O') {
countO++;
} else if (board[i].charAt(j) == 'X') {
countX++;
}
}
}
// 불가능한 개수를 가진 경우 (게임판이 비었을 때를 따로 체크)
if (countO - 2 >= countX || ((countO < countX) && (countO > 0 || countX > 0))) {
return 0;
}
// 빙고였을 때
// 가로
for (int i = 0; i < 3; i++) {
int bingoO = 0;
int bingoX = 0;
for (char ox : board[i].toCharArray()) {
if (ox == 'O') bingoO++;
else if (ox == 'X') bingoX++;
}
if (!checkBingo(bingoO, bingoX, countO, countX)) return 0;
}
// 세로
for (int i = 0; i < 3; i++) {
int bingoO = 0;
int bingoX = 0;
for (int j = 0; j < 3; j++) {
if (board[j].charAt(i) == 'O') {
bingoO++;
} else if (board[j].charAt(i) == 'X') {
bingoX++;
}
}
if (!checkBingo(bingoO, bingoX, countO, countX)) return 0;
}
// 대각선
if (board[0].charAt(0) == board[1].charAt(1) && board[1].charAt(1) == board[2].charAt(2) ||
board[0].charAt(2) == board[1].charAt(1) && board[1].charAt(1) == board[2].charAt(0)) {
int bingoO = 0;
int bingoX = 0;
if (board[1].charAt(1) == 'O') bingoO = 3;
else bingoX = 3;
if (!checkBingo(bingoO, bingoX, countO, countX)) return 0;
}
return answer;
}
// 빙고 체크
private boolean checkBingo(int bingoO, int bingoX, int countO, int countX) {
if (bingoO == 3) {
if (countO <= countX) return false;
} else if (bingoX == 3) {
if (countO > countX) return false;
}
return true;
}
}


🔅 리팩토링
❗ 오답노트 / 필요한 지식
- 가로, 세로, 대각선을 간단하게 생각할 방법을 찾다가 일단 풀어보자라는 생각으로 했다.
- 다른 사람의 방식은 한 행 혹은 열에만 배열 접근해서 하드코딩으로 각각 비교하는 방식을 했다.
- board[i].charAt(0) == board[i].charAt(1) && board[i].charAt(1) == board[i].charAt(2) 이런식
'programmers > Lv 2' 카테고리의 다른 글
택배상자 [자바] (0) | 2025.01.20 |
---|---|
뒤에 있는 큰 수 찾기 [자바] (0) | 2025.01.16 |
연속된 부분 수열의 합 [자바] (0) | 2025.01.04 |
두 원 사이의 정수 쌍 [자바] (0) | 2025.01.03 |
요격 시스템 [자바] (2) | 2024.12.30 |