본문 바로가기

알고리즘 문제풀이

[Programmers] 프로그래머스 Lv.2 혼자서 하는 틱택토 문제풀이(C++)

반응형

무난무난한 문제였음 / 경우를 잘 따져가면서 case를 나누는게 포인트

조금 코드가 더러운 느낌이 있지만, 문제를 푸는 당시엔 코드 깨끗이 정리하다가 시간 까먹을거 같아서 계속 진행시켰었음

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <string>
#include <vector>
 
using namespace std;
/*
<문제>
틱택토 게임정보를 담은 3*3 배열 주어질 때, 규칙을 지킨 상황인지 아닌지를 return(1 or 0 리턴)
 -> 실수를 무조건 했다고 판단되는 상황에만 0을 리턴하는 것
선공은 무조건 "O"임 
원소는 모두 "O", "X", "."으로 이루어짐 / '.'은 빈칸
빈칸이 모두 차면 무승부로 게임 종료
 
<풀이>
규칙을 지켜서 해보면서 찾기
O랑 X 개수 판별(O가 하나 더 많거나, 서로 같아야 함)
대각선, 직선 같은 거 있는지 판별
 
<시간>
3*3 배열이라 신경 안썼음 - O(n^2)까진 무난할 거라 판단
 
*/
struct WinInfo{ //승리 정보
    vector<int> position;  //이긴 경우의 해당 자리들
    string who_win; //누가 이겼는지
};
 
int solution(vector<string> board) {
    int answer = -1;
    int o_num=0, x_num=0;   //판의 o, x 개수
    vector<string> board_1; //직선으로 표현한 보드
    for(int i=0; i<3; i++){
        for(int j=0; j<3; j++){
            if(board[i][j]=='O') o_num++;
            else if(board[i][j]=='X') x_num++;
        }
    }//판의 O, X 개수 저장
    
    //o가 하나더 많거나 서로 같지 않으면 정상적이지 않음
    if(!(o_num - x_num == 0 || o_num - x_num ==1)) return 0;   
    
    vector<vector<int> > win_position = {   //이기는 경우의 자리번호들
        {123}, {456}, {789},
        {147}, {258}, {369},
        {159}, {357}
        };
    
    int o_win=0int x_win=0;   //서로 이긴 횟수
    
    for(int i=0; i<win_position.size(); i++){  //win_position 반복하면서 승리판단
        bool flag=trueint pos=win_position[i][0]-1char tmp=board[pos/3][pos%3]; //처음위치 문자
        for(int j=1; j<3; j++){
            int p=win_position[i][j]-1//처음위치 문자랑 비교
            if(board[p/3][p%3]!=tmp) flag=false;
        }
        if(flag && tmp=='O') o_win++;   //승리횟수 카운트
        if(flag && tmp=='X') x_win++;
    }
    
    if(o_win==1 && x_win==0){ //O가 하나 더 많은경우(O만 이길 수 있음)
        if(o_num-x_num==1return 1;
        else return 0;
    }
    else if (o_win==0 && x_win==1){   //O랑 X랑 수가 같은 경우(X만 이길 수 있음)
        if(o_num-x_num==0return 1;
        else return 0;
    }
    else if(o_win>=1 && x_win>=1return 0//모두 한번이상 승리 -> 불가능
    else if(o_win==0 && x_win==0return 1//무승부 또는 판이 진행중 -> 가능
    
    return 1;   //그 외 모두 가능
}
cs

 

반응형