Algorithm/프로그래머스

혼자서 하는 틱택토

문제파악 및 재정의

틱택토 -> 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;
    }
}


회고

이 블로그를 참조해서 풀었습니다.

https://velog.io/@qodlstjd12/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%98%BC%EC%9E%90%EC%84%9C-%ED%95%98%EB%8A%94-%ED%8B%B1%ED%83%9D%ED%86%A0-java

 

프로그래머스 혼자서 하는 틱택토 java

문제 링크일단 o, x가 각각 몇 번이 나왔는지 다 세고, 누군가 이겼다면 줄이 몇 개가 완성이 되었는지 가져오자절대 일어날 수 없는 일 (x가 o보다 많다거나 둘 다 한줄을 완성했다거나 등등 모든

velog.io

 

 

실현 가능한 조건임을 판별하는것이 생각보다 어려웠다. 알고리즘 자체는 특별히 쓴 건 없었다.

'Algorithm > 프로그래머스' 카테고리의 다른 글

신규 아이디 추천  (0) 2023.03.17
푸드 파이트 대회  (0) 2023.02.28
가장 가까운 같은 글자  (0) 2023.02.28
[프로그래머스] 부족한 금액 계산하기  (0) 2021.08.11
[프로그래머스] 상호 평가  (0) 2021.08.11