반응형
https://www.acmicpc.net/problem/7682
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 128 MB | 1175 | 370 | 258 | 30.824% |
문제
틱택토 게임은 두 명의 사람이 번갈아가며 말을 놓는 게임이다. 게임판은 3×3 격자판이며, 처음에는 비어 있다. 두 사람은 각각 X 또는 O 말을 번갈아가며 놓는데, 반드시 첫 번째 사람이 X를 놓고 두 번째 사람이 O를 놓는다. 어느 때든지 한 사람의 말이 가로, 세로, 대각선 방향으로 3칸을 잇는 데 성공하면 게임은 즉시 끝난다. 게임판이 가득 차도 게임은 끝난다.
게임판의 상태가 주어지면, 그 상태가 틱택토 게임에서 발생할 수 있는 최종 상태인지를 판별하시오.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 줄은 9개의 문자를 포함하며, 'X', 'O', '.' 중 하나이다. '.'은 빈칸을 의미하며, 9개의 문자는 게임판에서 제일 윗 줄 왼쪽부터의 순서이다. 입력의 마지막에는 문자열 "end"가 주어진다.
출력
각 테스트 케이스마다 한 줄에 정답을 출력한다. 가능할 경우 "valid", 불가능할 경우 "invalid"를 출력한다.
예제 입력 1
XXXOO.XXX
XOXOXOXOX
OXOXOXOXO
XXOOOXXOX
XO.OX...X
.XXX.XOOO
X.OO..X..
OOXXXOOXO
end
예제 출력 1
invalid
valid
invalid
valid
valid
invalid
invalid
invalid
코드
/*
틱택토
해당 배치가 최종적으로 끝날 수 있는 상태인지 판별
규칙을 싹 다 찾아보자.
*/
import java.io.*;
import java.util.*;
public class p7682 {
static char[][] map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String line = br.readLine();
if (line.equals("end")) break;
map = new char[3][3];
for (int i = 0; i < 9; i++) {
map[i / 3][i % 3] = line.charAt(i);
}
if (test(map)) {
System.out.println("valid");
} else {
System.out.println("invalid");
}
}
}
static boolean test(char[][] map) {
boolean ret = false;
int oCnt = 0, xCnt = 0, empty = 0;
for (int i = 0; i < 9; i++) {
if (map[i / 3][i % 3] == 'X') {
xCnt++;
} else if (map[i / 3][i % 3] == 'O') {
oCnt++;
} else {
empty++;
}
}
if (xCnt + oCnt == 9) {
if (xCnt - 1 != oCnt || isValid(map, 'O')) {
return false;
}
return true;
} else {
// O로 끝나야함
if (xCnt == oCnt) {
boolean isO = isValid(map, 'O');
boolean isX = isValid(map, 'X');
if (isO && !isX) {
return true;
} else {
return false;
}
}
// X로 끝나야 함
else if (xCnt - 1 == oCnt) {
boolean isO = isValid(map, 'O');
boolean isX = isValid(map, 'X');
if (!isO && isX) {
return true;
} else {
return false;
}
}
}
return ret;
}
static boolean isValid(char[][] map, 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;
}
}
반응형
'알고리즘 > [ Baekjoon ]' 카테고리의 다른 글
[ BOJ ][JAVA][19622] 회의실 배정 3 (1) | 2021.05.21 |
---|---|
[ BOJ ][JAVA][10775] 공항 (0) | 2021.05.20 |
[ BOJ ][JAVA][3184] 양 (0) | 2021.05.20 |
[ BOJ ][JAVA][1926] 그림 (0) | 2021.05.20 |
[ BOJ ][JAVA][19947] 투자의 귀재 배주형 (0) | 2021.05.19 |