본문으로 바로가기

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

 

프로그래머스

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

programmers.co.kr

 


풀이

 

틱택토 게임 결과 판이 있을 때

그 게임이 정상적으로 게임을 진행했을 때 나오는 결과인지만 판단하면 된다. 

 

주인공이 잘못적었는지 가 아닌 O, X 가 번갈아가면서 진행했을 때 정상적으로 나올 수 있는지만 판단하면 된다. 

 

class Solution {
    public int solution(String[] board) {
        String[][] map = new String[3][3];
        int o_cnt = 0;
        int x_cnt = 0;
        
        for(int i = 0; i<3; i++) {
            String[] tmp = board[i].split("");
            for(int j = 0; j<3; j++) {
                map[i][j] = tmp[j];
    
                if ("O".equals(tmp[j]))
                    o_cnt++;
                if ("X".equals(tmp[j]))
                    x_cnt++;
            }
        }
        
        // X 는 O 보다 많을 수 없고, O는 X 보다 1개 많아야 한다 
        if (x_cnt - o_cnt > 0 || o_cnt - x_cnt > 1) {
            return 0;
        }
        
        boolean o_check = check("O", map);
        boolean x_check = check("X", map);
        
        if (o_check && x_cnt + 1 != o_cnt)
            return 0;
        
        if (x_check && x_cnt != o_cnt)
            return 0;
        
        return 1;
    }
    
    private boolean check(String target, String[][] map) {
        // 가로
        for(int i = 0; i<3; i++) {
            if (map[i][0].equals(target) && map[i][1].equals(target) && map[i][2].equals(target))
                return true;
        }
        
        // 세로
        for(int i = 0; i<3; i++) {
            if (map[0][i].equals(target) && 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[2][0].equals(target) && map[1][1].equals(target) && map[0][2].equals(target))
            return true;
        
        return false;
    }
}