문제/프로그래머스

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

icodesiuuuu 2024. 11. 19. 17:41

문제

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 


 

문제 개요

틱택토 게임을 혼자서 진행하던 머쓱이가 규칙을 어겼는지 판단하기 위해, 현재 게임판이 규칙에 맞는 상태인지 확인하는 문제입니다. 게임판을 나타내는 문자열 배열 board가 주어질 때, 규칙에 맞는 상태라면 1을, 그렇지 않으면 0을 반환하는 solution 함수를 작성하는 문제입니다.

규칙 위반 조건:

  1. "O"와 "X"의 순서가 맞지 않은 경우 ("O" 차례에 "X"가 표시되거나 그 반대).
  2. 승리 조건이 충족되어 게임이 종료되어야 하는데도 게임이 진행된 경우.

 

접근 방법

틱택토 규칙이 위반하지 않은 조건인지 모두 확인 (코드 내 주석 참고)

 

import java.util.*;
class Solution {
    static String[][] map = new String[3][3];
    public int solution(String[] board) {        
        for(int i=0; i<board.length; i++) map[i] = board[i].split("");        
        return isPossible() ? 1 : 0;
    }
    
    public boolean isPossible() {
        int cntO = 0, cntX = 0;
        for(int i=0; i<3; i++) {
            for(int j=0; j<3; j++) {
                if(map[i][j].equals("O")) cntO++;
                if(map[i][j].equals("X")) cntX++;
            }
        }
        boolean correctO = correct("O");
        boolean correctX = correct("X");        
        
        if(cntX > cntO) return false; //X가 더 많을 경우
        if(Math.abs(cntX - cntO) >= 2) return false; //X와 O의 수가 2개 이상 차이날 경우
        if(correctO && correctX) return false; //X와 O 둘 다 완성됐을 경우
        if(correctX && (cntO > cntX)) return false; //X가 완성 됐지만 O의 수가 더 많을 경우
        if(correctO && (cntO == cntX)) return false; //O가 완성 됐지만 O와 X의 수와 같을 경우
        
        return true;
    }
    
    public boolean correct(String target) {
        for(int i=0; i<3; i++) {
            if(map[i][0].equals(target)) {
                if(map[i][1].equals(target) && (map[i][2]).equals(target)) return true;
            }
            if(map[0][i].equals(target)) {
                if(map[1][i].equals(target) && (map[2][i]).equals(target)) return true;
            }            
        }
        if(map[0][0].equals(target) && map[1][1].equals(target) && map[2][2].equals(target)) return true;
        if(map[0][2].equals(target) && map[1][1].equals(target) && map[2][0].equals(target)) return true;
        
        return false;
    }
}

 

유사한 문제

https://icodesiuuuu.tistory.com/30

 

[백준] 7682 틱택토 - Java

문제https://www.acmicpc.net/problem/7682  문제 개요틱택토는 두 명이 번갈아 가며 말을 놓는 게임으로, 3×3 격자판에서 X와 O를 배치하여 가로, 세로, 또는 대각선 방향으로 연속된 3칸을 채우면 승리하

icodesiuuuu.tistory.com