문제파악 및 재정의
틱택토 -> O X O X O X -> 가로, 세로, 대각선으로 완성되면 승리 3칸이 완성되지 않는다면 무승부
1.차례에 맞지 않는 진행
2.승리 후 게임 진행
O, X, .(빈칸)으로 구성된 board를 참조하여 규칙을 지킨 틱택토일 경우 1 아니라면 0을 반환
O . X
. O .
. . X
선,후공 세트 + 3칸으로 게임을 끝냈을 때 진행 여부 판별
O나 X가 가로, 세로, 3칸을 완성했는가? -> 3칸 완성 이후 게임의 진행? ->
가로 [0][0] [0][1] [0][2]
세로 [0][0] [1][0] [2][0]
대각선 -> [0][0] [1][1] [2][2] i == j or [2][0] [1][1] [0][2] -> i + j == board.length -1
자료구조 및 알고리즘 선택
3*3 이차원 배열 -> 순회
1. get O, X Counts and isGameSet
2. isGameSet ? -> 가로 / 세로 / 대각선
3.1 isGameSet -> true -> O와 X의 갯수 불일치
3.2 isGameSet -> false -> O와 X의 갯수 일치 단 O와 X의 합이 9일 경우 불일치 가능
구현
1차시도
import java.util.Arrays;
class Solution {
public int solution(String[] board){
int result = 0;
boolean checkGame = false;
String[] vertical = convertString(board,3);
String[] cross = convertString(board, 2);
checkGame = isGameSet(board);
if(checkGame == false){
checkGame = isGameSet(vertical);
}
if(checkGame == false){
checkGame = isGameSet(cross);
}
int countO = getCounts(board,'O');
int countX = getCounts(board,'X');
int diff = countO - countX;
if(checkGame){
if(diff != 0) result = 1;
}else {
if(countO + countX != 9){
if(diff == 0) result = 1;
}else {
if(diff != 0) result = 1;
}
}
return result;
}
public String[] convertString(String[] board, int option) {
String[] temp = new String[option];
StringBuilder sb = new StringBuilder();
if(option == 3) {
for(int idx = 0; idx < 3; idx++){
for(int sidx = 0; sidx < 3; sidx++){
sb.append(board[sidx].charAt(idx));
}
temp[idx] = sb.toString();
sb.delete(0,3);
}
} else {
for(int idx = 0; idx < 3; idx++) {
for(int sidx = 0; sidx < 3; sidx++){
if(idx == sidx) sb.append(board[idx].charAt(sidx));
}
}
temp[0] = sb.toString();
sb.delete(0,3);
for(int idx = 0; idx < 3; idx++) {
for(int sidx = 0; sidx < 3; sidx++){
if(idx+sidx == 2) sb.append(board[idx].charAt(sidx));
}
}
temp[1] = sb.toString();
}
return temp;
}
public int getCounts(String[] board, char ox) {
int count = 0;
for(int idx = 0; idx < 3; idx ++) {
for(int sidx = 0; sidx < 3; sidx++){
if(ox == board[idx].charAt(sidx)) count++;
}
}
return count;
}
public boolean isGameSet(String[] board) {
Boolean check = false;
for(int idx = 0; idx < board.length; idx ++) {
if(board[idx].equals("OOO") || board[idx].equals("XXX")){
check = true;
break;
}
}
return check;
}
}
2차시도
import java.util.*;
class Solution {
public int solution(String[] board){
int result = 1;
Map<String, Boolean> checkGame = new HashMap<>();
String[] vertical = convertString(board,3);
String[] cross = convertString(board, 2);
checkGame = isGameSet(board, checkGame);
checkGame = isGameSet(vertical, checkGame);
checkGame = isGameSet(cross, checkGame);
int oCnt = getCounts(board,'O');
int xCnt = getCounts(board,'X');
if(checkGame.containsKey("O") && checkGame.containsKey("X")) return 0;
if(xCnt > oCnt || oCnt - xCnt > 1) return 0;
if(checkGame.containsKey("O")) {
if(oCnt == xCnt) return 0;
}
if(checkGame.containsKey("X")) {
if(oCnt > xCnt) return 0;
}
return result;
}
public String[] convertString(String[] board, int option) {
String[] temp = new String[option];
StringBuilder sb = new StringBuilder();
if(option == 3) {
for(int idx = 0; idx < 3; idx++){
for(int sidx = 0; sidx < 3; sidx++){
sb.append(board[sidx].charAt(idx));
}
temp[idx] = sb.toString();
sb.delete(0,3);
}
} else {
for(int idx = 0; idx < 3; idx++) {
for(int sidx = 0; sidx < 3; sidx++){
if(idx == sidx) sb.append(board[idx].charAt(sidx));
}
}
temp[0] = sb.toString();
sb.delete(0,3);
for(int idx = 0; idx < 3; idx++) {
for(int sidx = 0; sidx < 3; sidx++){
if(idx+sidx == 2) sb.append(board[idx].charAt(sidx));
}
}
temp[1] = sb.toString();
}
return temp;
}
public int getCounts(String[] board, char ox) {
int count = 0;
for(int idx = 0; idx < 3; idx ++) {
for(int sidx = 0; sidx < 3; sidx++){
if(ox == board[idx].charAt(sidx)) count++;
}
}
return count;
}
public Map<String, Boolean> isGameSet(String[] board, Map<String, Boolean> map) {
for(int idx = 0; idx < board.length; idx ++) {
if(board[idx].equals("OOO")){
map.put("O", true);
}else if(board[idx].equals("XXX")) {
map.put("X", true);
}else {
map.put(".", true);
}
}
return map;
}
}
회고
이 블로그를 참조해서 풀었습니다.
실현 가능한 조건임을 판별하는것이 생각보다 어려웠다. 알고리즘 자체는 특별히 쓴 건 없었다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
신규 아이디 추천 (0) | 2023.03.17 |
---|---|
푸드 파이트 대회 (0) | 2023.02.28 |
가장 가까운 같은 글자 (0) | 2023.02.28 |
[프로그래머스] 부족한 금액 계산하기 (0) | 2021.08.11 |
[프로그래머스] 상호 평가 (0) | 2021.08.11 |