본문 바로가기
알고리즘 풀이/프로그래머스

[프로그래머스] 혼자서 하는 틱택토(Java)

by char_lie 2024. 4. 12.
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/160585

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

혼자서 하는 틱택토 문제

틱택토의 판이 가능한 형태인지 아닌지 체크하는 문제

 

#사용 알고리즘

구현

1. 주어진 판이 가능한지 판별해야한다. 그러기 위해서는 O, X의 빙고에 따른 조건을 따져야한다.

2. 기본적으로 O가 선공, X가 후공이므로 O와 X의 갯수가 다르거나 2개 이상 차이나면 틱택토가 불가능하다.

3. O가 빙고일 때 X도 빙고면 불가능하고, 빙고라면 O가 X보다 1개 많아야한다.

3. X가 빙고라면 O와 X의 갯수가 같아야한다.

4. 위 조건에 맞게 구현하면 성공
반응형

⚙ 내가 푼 정답 코드

class Solution {
    public static char[][] boards = new char[3][3];
    public static int checker(char s){
        for (int i = 0; i < 3; i++){
            // 세로 줄
            if(boards[i][0] == s && boards[i][1] == s && boards[i][2] == s){
                return 1;
            }
            // 가로 줄
            if(boards[0][i] == s && boards[1][i] == s && boards[2][i] == s){
                return 1;
            }
        }
        // 대각선 \
        if (boards[0][0] == s && boards[1][1] == s && boards[2][2] == s){
            return 1;
        }
        // 대각선 /
        if (boards[0][2] == s && boards[1][1] == s && boards[2][0] == s){
            return 1;
        }
        // 빙고 없으면
        return 0;
    }
    
    public int solution(String[] board) {
        int O = 0;
        int X = 0;
        for(int i = 0 ; i< 3; i++){
            for(int j = 0 ; j < 3; j++){
                boards[i][j] = board[i].charAt(j);
                if(boards[i][j] == 'O'){
                    O++;
                }
                else if(boards[i][j] == 'X'){
                    X++;
                }
            }
        }
        int result = 1;
        int o = checker('O');
        int x = checker('X');
        
        if(O < X || O > X+1){ // O가 X보다 작거나 (O가 선공) O가 X보다 2개 이상 많을 경우(O를 2번 이상 더 둠)
            result = 0;
        }
        else if (o == 1 && x == 1){ // O로 빙고지만, X도 빙고라면 (선공 후공 규칙)
            result = 0;
        }   
        else if(o == 1 && O != X+1){ // O로 빙고지만, O와 X 갯수가 1개 차이가 아니면(선공)
            result = 0;
        }
        else if(x == 1 && O != X){ // X로 빙고지만, O와 X 갯수가 같지 않으면(후공)
            result = 0;
        }
            
        return result;
    }
}
반응형

댓글