본문 바로가기
코테

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

by 상똥 2024. 9. 16.
풀이
1. O의 개수를 O_num, X의 개수를 X_num으로 선언한다. 초기값은 0
2. 이중 배열 map에 틱택토를 그린다
- 그려가며 각 문자의 수를 기록한다
3. 존재할 수 없는 경우의 수를 기록한다 
- O가 X보다 적은 경우 (O가 선공이므로, O가 더 적은 경우는 존재할 수 없다)
- O가 X보다 2개 이상 많은 경우 (번갈아가면서 해야하므로 최대 1만 차이날 수 있다)
- O와 X가 동일하면서, O가 세 개 연속 존재하는 경우 (O가 이미 이겼음에도 이미 경기를 이어갔다는 것을 의미)
- O와 X보다 한 개 더 많으면서, X가 세 개 연속 존재하는 경우 (X가 이미 이겼음에도 이미 경기를 이어갔다는 것을 의미)
4. 위의 경우 중 하나에 걸리면 return 0, 아니면 return 1
회고
이런 문제는 머리를 잘 굴려서 경우의 수를 차분히 생각해보아야 한다
코드 (접은 글)
더보기
import java.util.*;

class Solution {
    public int solution(String[] board) {
        int O_num = 0;
        int X_num = 0;
        String[][] map = new String[3][3];
        
        for(int i = 0; i < 3; i++)
            for(int j = 0; j < 3; j++) {
                String temp = board[i].substring(j, j + 1);
                if (temp.equals("O")) O_num++;
                else if(temp.equals("X")) X_num++;
                map[i][j] = temp;
            }
        
        // O > X+1 이거나, O < X인 경우
        if((O_num > X_num + 1) || (O_num < X_num)) return 0;
        
        // 개수가 같은 경우 : O 세 개 연속만 아니면 통과
        else if(O_num == X_num){
            if(increaseRow(map, "O") == 0) return 0;
            else if(increaseCol(map, "O") == 0) return 0;
            else if(increaseRowAndCol1(map, "O") == 0) return 0;
            else if(increaseRowAndCol2(map, "O") == 0) return 0;
            return 1;
        }
        
        // O == X+1인 경우 : X 세 개 연속만 아니면 통과
        else if(O_num > X_num) {
            if(increaseRow(map, "X") == 0) return 0;
            else if(increaseCol(map, "X") == 0) return 0;
            else if(increaseRowAndCol1(map, "X") == 0) return 0;
            else if(increaseRowAndCol2(map, "X") == 0) return 0;
            return 1;
        }
        return 1;
    }
    
    private int increaseRow(String[][] map, String temp) {
        for(int i = 0; i < 3; i++)
            if(temp.equals(map[0][i]) && temp.equals(map[1][i]) && temp.equals(map[2][i])) return 0;
        return 1;
    }
    
    private int increaseCol(String[][] map, String temp) {
        for(int i = 0; i < 3; i++)
            if(temp.equals(map[i][0]) && temp.equals(map[i][1]) && temp.equals(map[i][2])) return 0;
        return 1;
    }
    
    private int increaseRowAndCol1(String[][] map, String temp) {
        if(temp.equals(map[0][0]) && temp.equals(map[1][1]) && temp.equals(map[2][2])) return 0;
        else return 1;
    }
        
    private int increaseRowAndCol2(String[][] map, String temp) {
        if(temp.equals(map[2][0]) && temp.equals(map[1][1]) && temp.equals(map[0][2])) return 0;
        else return 1;
    }
}

 

'코테' 카테고리의 다른 글

[java] [PCCP 기출문제] 1번 / 동영상 재생기  (1) 2024.09.25
[java] 짝지어 제거하기  (0) 2024.01.11
[java] 귤 고르기  (1) 2024.01.11
[python] 프로그래머스스쿨 더 맵게  (0) 2023.12.14
[Java] 심화 1단계  (1) 2023.11.13