문제 출처 : https://www.acmicpc.net/problem/7682
7682번: 틱택토
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 줄은 9개의 문자를 포함하며, 'X', 'O', '.' 중 하나이다. '.'은 빈칸을 의미하며, 9개의 문자는 게임판에서 제일 윗 줄 왼쪽부터의 순서이다. 입
www.acmicpc.net
문제 설명
틱택토 게임은 두 명의 사람이 번갈아가며 말을 놓는 게임이다. 게임판은 3×3 격자판이며, 처음에는 비어 있다. 두 사람은 각각 X 또는 O 말을 번갈아가며 놓는데, 반드시 첫 번째 사람이 X를 놓고 두 번째 사람이 O를 놓는다. 어느 때든지 한 사람의 말이 가로, 세로, 대각선 방향으로 3칸을 잇는 데 성공하면 게임은 즉시 끝난다. 게임판이 가득 차도 게임은 끝난다.
게임판의 상태가 주어지면, 그 상태가 틱택토 게임에서 발생할 수 있는 최종 상태인지를 판별하시오.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 줄은 9개의 문자를 포함하며, 'X', 'O', '.' 중 하나이다. '.'은 빈칸을 의미하며, 9개의 문자는 게임판에서 제일 윗 줄 왼쪽부터의 순서이다. 입력의 마지막에는 문자열 "end"가 주어진다.
출력
각 테스트 케이스마다 한 줄에 정답을 출력한다. 가능할 경우 "valid", 불가능할 경우 "invalid"를 출력한다.
풀이
게임이 끝나는 조건을 나열해보면
- X의 개수 = O의 개수 + 1 (X가 이김 or 승패는 안정해지지만 게임은 정상적으로 끝남)
- X의 개수 = O의 개수 (O가 이김)
2가지로 나눌 수 있다.
입력을 받으면서 X, O의 개수를 카운트 해주고
X가 이기는 경우는 판이 다 찼을 경우와 아닌 경우로 나누어서
X가 빙고가 되며 O가 빙고가 안된 경우로 빙고 여부를 판별하고
O가 이기는 경우는 O가 빙고가 되며 X가 빙고가 안된 경우로 나누어서 판별하였다.
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
// 게임 최종 판결 조건
// X의 개수 = O의 개수 + 1 (x가 이김)
// X의 개수 = O의 개수 (o가 이김)
public class boj_7682 {
static char[][] map;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
while (true) {
String input = br.readLine();
if (input.equals("end")) {
break;
}
map = new char[3][3];
int xCnt = 0;
int oCnt = 0;
int idx = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
map[i][j] = input.charAt(idx++);
if (map[i][j] == 'X') {
xCnt++;
} else if (map[i][j] == 'O') {
oCnt++;
}
}
}
if (xCnt == oCnt + 1) { // x가 이김
if (xCnt + oCnt == 9 && !bingo('O')) {
sb.append("valid").append("\n");
} else if (!bingo('O') && bingo('X')) {
sb.append("valid").append("\n");
} else {
sb.append("invalid").append("\n");
}
} else if (xCnt == oCnt) { //o가 이김
if (!bingo('X') && bingo('O')) {
sb.append("valid").append("\n");
} else {
sb.append("invalid").append("\n");
}
} else {
sb.append("invalid").append("\n");
}
}
System.out.println(sb);
}
public static boolean bingo(char c) {
// 가로
for (int i = 0; i < 3; i++) {
if (map[i][0] == c && map[i][1] == c && map[i][2] == c) {
return true;
}
}
// 세로
for (int i = 0; i < 3; i++) {
if (map[0][i] == c && map[1][i] == c && map[2][i] == c) {
return true;
}
}
// 대각선
if (map[0][0] == c && map[1][1] == c && map[2][2] == c) {
return true;
}
if (map[0][2] == c && map[1][1] == c && map[2][0] == c) {
return true;
}
return false;
}
}
결과
'Algorithm > Baekjoon' 카테고리의 다른 글
백준 2138 전구와 스위치(Java) (2) | 2023.03.20 |
---|---|
백준 17142 연구소 3(Java) (0) | 2023.03.19 |
백준 20006 랭킹전 대기열(Java) (0) | 2023.03.16 |
백준 2607 비슷한 단어(Java) (0) | 2023.03.15 |
백준 21610 마법사 상어와 비바라기(Java) (0) | 2023.01.10 |