알고리즘(백준 등) 공부
SWEA 11545. 틱택톰
posite
2026. 5. 30. 12:10
4 x 4 공간에 O, X, T, 빈칸이 놓여저 있다. 행, 열, 대각선 중 하나라도 O 4개, X 4개, O 3개 + T, X 3개 + T로 놓여 있다면 해당 사람이 승리하는 경우이다. 게임이 끝난 경우 이긴 자를 출력 혹은 비겼음을 출력하고, 끝나지 않았다면 아직 게임이 끝나지 않았음을 출력하는 문제이다.
O, X에 대해서 가로, 세로, 대각선에 대한 확인을 통해 승리 조건을 만족한 사람이 있는지 확인한다. 있다면 해당 사람이 이긴것이다.
private static boolean checkWin(String[] board, char player) {
for (int i = 0; i < 4; i++) {
if (checkLine(board[i].charAt(0), board[i].charAt(1), board[i].charAt(2), board[i].charAt(3), player)) return true;
if (checkLine(board[0].charAt(i), board[1].charAt(i), board[2].charAt(i), board[3].charAt(i), player)) return true;
}
if (checkLine(board[0].charAt(0), board[1].charAt(1), board[2].charAt(2), board[3].charAt(3), player)) return true;
if (checkLine(board[0].charAt(3), board[1].charAt(2), board[2].charAt(1), board[3].charAt(0), player)) return true;
return false;
}
private static boolean checkLine(char c1, char c2, char c3, char c4, char player) {
return (c1 == player || c1 == 'T') &&
(c2 == player || c2 == 'T') &&
(c3 == player || c3 == 'T') &&
(c4 == player || c4 == 'T');
}
이긴 사람이 없다면 빈 공간이 있는지 확인하여 빈 공간이 있다면 아직 게임이 종료되지 않은 것이다. 빈 공간이 없다면 비긴 것이다.
boolean xWon = checkWin(board, 'X');
boolean oWon = checkWin(board, 'O');
boolean hasEmpty = false;
for (int i = 0; i < 4; i++) {
if (board[i].contains(".")) {
hasEmpty = true;
break;
}
}
if (xWon) {
sb.append("X won\n");
} else if (oWon) {
sb.append("O won\n");
} else if (hasEmpty) {
sb.append("Game has not completed\n");
} else {
sb.append("Draw\n");
}
결과 코드는 다음과 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
int size = 4;
StringBuilder sb = new StringBuilder();
for (int tc = 1; tc <= T; tc++) {
sb.append('#').append(tc).append(' ');
if(tc != 1) br.readLine();
String[] board = new String[size];
for(int i=0; i<size; i++) {
String line = br.readLine();
board[i] = line;
}
boolean xWon = checkWin(board, 'X');
boolean oWon = checkWin(board, 'O');
boolean hasEmpty = false;
for (int i = 0; i < 4; i++) {
if (board[i].contains(".")) {
hasEmpty = true;
break;
}
}
if (xWon) {
sb.append("X won\n");
} else if (oWon) {
sb.append("O won\n");
} else if (hasEmpty) {
sb.append("Game has not completed\n");
} else {
sb.append("Draw\n");
}
}
br.close();
System.out.print(sb);
}
private static boolean checkWin(String[] board, char player) {
for (int i = 0; i < 4; i++) {
if (checkLine(board[i].charAt(0), board[i].charAt(1), board[i].charAt(2), board[i].charAt(3), player)) return true;
if (checkLine(board[0].charAt(i), board[1].charAt(i), board[2].charAt(i), board[3].charAt(i), player)) return true;
}
if (checkLine(board[0].charAt(0), board[1].charAt(1), board[2].charAt(2), board[3].charAt(3), player)) return true;
if (checkLine(board[0].charAt(3), board[1].charAt(2), board[2].charAt(1), board[3].charAt(0), player)) return true;
return false;
}
private static boolean checkLine(char c1, char c2, char c3, char c4, char player) {
return (c1 == player || c1 == 'T') &&
(c2 == player || c2 == 'T') &&
(c3 == player || c3 == 'T') &&
(c4 == player || c4 == 'T');
}
}