프로그래머스 - 틱택토 게임(Java)
By on January 29, 2024
프로그래머스 - 틱택토 게임(Java)
문제 링크 : 틱택토 게임
틱택토 게임 이란?
틱택토 게임은 우리나라 오목과 비슷하다. 3*3 보드판에서 O 와 X 를 번갈아 가면서 두고 가로,세로,대각으로 한줄이 완성 되면 이기는 게임이다.
문제 해결 접근법
이번 문제는 규칙을 찾는게 가장 핵심이 었다.
규칙
- 보드가 전부 비었다면 아직 시작 하지 않았으므로 (정상)
- 항상 O 부터 게임을 시작 하기 때문에 X > O 가 되면 (규칙 위반)
- O 를 X 보다 1개 이상(2개) 두었다면 (규칙 위반)
- O 와 X 둘다 빙고가 될 수 없다(규칙 위반)
- O 가 빙고 라면 O 는 X 보다 항상 1개가 많아야 한다. (아니면 규칙 위반)
- X 가 빙고 라면 X 는 O 와 수가 같아야 한다. (아니면 규칙 위반)
소스
public class 틱택토게임 {
public int solution(String[] board) {
int answer = 1;
int o = 0;
int x = 0;
int n = 0;
for (String s : board) {
for (int j = 0; j < s.length(); j++) {
String item = String.valueOf(s.charAt(j));
if ("O".equals(item)) {
o++;
} else if ("X".equals(item)) {
x++;
} else {
n++;
}
}
}
//시작 하지 않은 상태 이므로 정상.
if(n == 9){
return 1;
}
// X 가 O 보다 수가 많으면 규칙위반
// O 가 X 보다 1개 이상 많이 두었다면 규칙 위반.
else if(x - o > 0 || o - x > 1){
return 0;
}
//빙고 체크
boolean O_bingo = bingo("O", board);
boolean X_bingo = bingo("X", board);
//두개다 빙고 일 수 없다.
if (O_bingo && X_bingo) {
return 0;
}
else if (O_bingo) {
//O 가 빙고 라면 O 는 X 보다 항상 1개가 많다.
if (o - x == 1) {
return 1;
}
return 0;
} else if (X_bingo) {
//X 가 빙고 라면 X 는 O 와 수가 같다.
if (x == o) {
return 1;
}
return 0;
}
return answer;
}
private boolean bingo(String item, String[] board){
//가로
for (String s : board) {
if (String.valueOf(s.charAt(0)).equals(item)
&& String.valueOf(s.charAt(1)).equals(item)
&& String.valueOf(s.charAt(2)).equals(item)
) {
return true;
}
}
//세로
for (int i = 0 ; i < board.length; i++) {
if(String.valueOf(board[0].charAt(i)).equals(item)
&& String.valueOf(board[1].charAt(i)).equals(item)
&& String.valueOf(board[2].charAt(i)).equals(item)
){
return true;
}
}
//대각
if(String.valueOf(board[1].charAt(1)).equals(".")) return false;
if(String.valueOf(board[0].charAt(0)).equals(item)
&& String.valueOf(board[1].charAt(1)).equals(item)
&& String.valueOf(board[2].charAt(2)).equals(item)){
return true;
}else if(String.valueOf(board[0].charAt(2)).equals(item)
&& String.valueOf(board[1].charAt(1)).equals(item)
&& String.valueOf(board[2].charAt(0)).equals(item)
){
return true;
}
return false;
}
@Test
void 틱택토게임_테스트(){
Assertions.assertThat(solution(new String[] {"O.X", ".O.", "..X"})).isEqualTo(1);
Assertions.assertThat(solution(new String[] {"OOO", "...", "XXX"})).isEqualTo(0);
Assertions.assertThat(solution(new String[] {"XXX", "...", "OOO"})).isEqualTo(0);
Assertions.assertThat(solution(new String[] {"...", ".X.", "..."})).isEqualTo(0);
Assertions.assertThat(solution(new String[] {"...", "...", "..."})).isEqualTo(1);
Assertions.assertThat(solution(new String[] {"OXO", ".OX", "OXX"})).isEqualTo(0);
Assertions.assertThat(solution(new String[] {"XXX", "XOO", "OOO"})).isEqualTo(0);
Assertions.assertThat(solution(new String[] {"XOX", "OOO", "XOX"})).isEqualTo(1);
Assertions.assertThat(solution(new String[] {"OOO", "OOO", "XXX"})).isEqualTo(0);
Assertions.assertThat(solution(new String[] {"OOO", "OXX", "OXX"})).isEqualTo(1);
Assertions.assertThat(solution(new String[] {"...", ".X.", "..."})).isEqualTo(0);
Assertions.assertThat(solution(new String[] {"OXO", "XOX", "OXO"})).isEqualTo(1);
Assertions.assertThat(solution(new String[] {"OXO", "XOX", "OXO"})).isEqualTo(1);
Assertions.assertThat(solution(new String[] {"OOX", "XXO", "OOX"})).isEqualTo(1);
Assertions.assertThat(solution(new String[] {"XXX", ".OO", "O.."})).isEqualTo(1);
Assertions.assertThat(solution(new String[] {"OX.", ".O.", ".XO"})).isEqualTo(1);
Assertions.assertThat(solution(new String[] {"...", "...", ".O."})).isEqualTo(1);
Assertions.assertThat(solution(new String[] {"X.X", "X.O", "O.O"})).isEqualTo(1);
Assertions.assertThat(solution(new String[] {"XO.", "OXO", "XOX"})).isEqualTo(1);
Assertions.assertThat(solution(new String[] {"OOO", "XOX", "XXO"})).isEqualTo(1);
Assertions.assertThat(solution(new String[] {"OOO", "XOX", "X.X"})).isEqualTo(0);
Assertions.assertThat(solution(new String[] {"XXX", "OO.", "OO."})).isEqualTo(0);
Assertions.assertThat(solution(new String[] {".X.", "...", "..."})).isEqualTo(0);
Assertions.assertThat(solution(new String[] {".X.", "X..", ".O."})).isEqualTo(0);
Assertions.assertThat(solution(new String[] {"XOX", "OXO", "XOX"})).isEqualTo(0);
Assertions.assertThat(solution(new String[] {"XXX", "XOO", "OOO"})).isEqualTo(0);
Assertions.assertThat(solution(new String[] {"OOX", "OXO", "XOO"})).isEqualTo(0);
Assertions.assertThat(solution(new String[] {"OOX", "OXO", "XOX"})).isEqualTo(0);
Assertions.assertThat(solution(new String[] {".OX", "OXO", "XO."})).isEqualTo(0);
Assertions.assertThat(solution(new String[] {"OOO", "XX.", "X.."})).isEqualTo(0);
}
}