
https://school.programmers.co.kr/learn/courses/30/lessons/160585
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
3 * 3 의 2차원배열에서 틱택토 게임을 진행하다가 만 상태 혹은 진행하던
상태의 board가 주어지면
board 상태를 분석하여 이것이 정상적인 규칙에 따라 진행되었던 board의 상태인지
아닌지를 확인하는 문제다.
그리하여 정상적인 규칙에 따라 진행되었던 board의 상태와 특징에 대해 분석하고
여러 조건을 검토하여 규칙 위반 여부를 판단하는 형식으로 풀이 하였다.
틱택토의 기본 규칙은 O와 X가 번갈아 가며 진행되며, 가로, 세로, 대각선으로 3개가 일치하면 승리한다는 점이다.
이를 바탕으로 머쓱이가 게임을 올바르게 진행했는지 점검한다.
우선 주어진 게임판은 문자열 배열 형태로 입력되는데,
이를 2차원 문자 배열로 변환하며 각 칸의 상태를 순회한다.
이 과정에서 O와 X의 개수를 세어 규칙을 지켰는지 확인한다.
O는 선공이므로 X보다 같거나 많아야 하고,
최대 1개까지만 더 많을 수 있다.
이를 점검하는 과정에서 개수가 올바르지 않다면
즉시 "규칙 위반"으로 판단하여 0을 반환한다.
다음으로 승리 조건을 확인한다.
빙고는 동일한 표시가 가로, 세로 또는 대각선으로 3개 연속으로 이루어질 때 성립한다.
각 행과 열을 순회하며 빙고를 탐지하고, 두 대각선도 별도로 확인한다.
승리 조건을 충족하는 경우, 해당 빙고가 O인지 X인지 기록하며,
이때 두 플레이어가 동시에 빙고를 만든 경우 규칙 위반으로 처리한다.
또한, O가 빙고를 만든 경우 O의 개수가 정확히 1개 더 많아야 하고,
X가 빙고를 만든 경우 두 개수가 동일해야 한다. 이 조건까지 만족해야만 "올바른 상태"로 판단된다. 이 문제는 조건을 바탕으로 구현하는 문제였다.
import java.util.*;
class Solution {
char[][] map = new char[3][3];
boolean bingoO = false, bingoX = false;
void isBingo(int n) {
char target = map[n][n];
if (target == '.') return;
if ((map[n][0] == target && map[n][1] == target && map[n][2] == target) ||
(map[0][n] == target && map[1][n] == target && map[2][n] == target)) {
if (target == 'O') bingoO = true;
else if (target == 'X') bingoX = true;
}
}
void crossLineCheck() {
if ((map[0][0] == map[1][1] && map[1][1] == map[2][2]) ||
(map[2][0] == map[1][1] && map[1][1] == map[0][2])) {
if (map[1][1] == 'O') bingoO = true;
else if (map[1][1] == 'X') bingoX = true;
}
}
boolean isValidRule(int oCount, int xCount) {
for (int i = 0; i < 3; i++) {
isBingo(i);
}
crossLineCheck();
if (bingoO && bingoX) return false;
if (bingoO && oCount != xCount + 1) return false;
if (bingoX && oCount != xCount) return false;
return true;
}
boolean checkCount(int oCount, int xCount) {
return oCount == xCount || oCount == xCount + 1;
}
public int solution(String[] board) {
int oCount = 0, xCount = 0;
for (int i = 0; i < 3; i++) {
map[i] = board[i].toCharArray();
for (int j = 0; j < 3; j++) {
if (map[i][j] == 'O') oCount++;
else if (map[i][j] == 'X') xCount++;
}
}
if (!checkCount(oCount, xCount)) return 0;
return isValidRule(oCount, xCount) ? 1 : 0;
}
}
'Algorithm & Data Structures > Programers' 카테고리의 다른 글
Lv 2. 석유 시추 (0) | 2025.01.14 |
---|---|
Lv 2. 두 원사이의 정수 쌍 (0) | 2025.01.11 |
Lv 3. 표 편집 (0) | 2025.01.07 |
Lv 2. N-Queen (1) | 2025.01.03 |
Lv 2. 과제 진행하기 (1) | 2024.12.30 |