반응형
무난무난한 문제였음 / 경우를 잘 따져가면서 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 = { //이기는 경우의 자리번호들
{1, 2, 3}, {4, 5, 6}, {7, 8, 9},
{1, 4, 7}, {2, 5, 8}, {3, 6, 9},
{1, 5, 9}, {3, 5, 7}
};
int o_win=0; int x_win=0; //서로 이긴 횟수
for(int i=0; i<win_position.size(); i++){ //win_position 반복하면서 승리판단
bool flag=true; int pos=win_position[i][0]-1; char 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==1) return 1;
else return 0;
}
else if (o_win==0 && x_win==1){ //O랑 X랑 수가 같은 경우(X만 이길 수 있음)
if(o_num-x_num==0) return 1;
else return 0;
}
else if(o_win>=1 && x_win>=1) return 0; //모두 한번이상 승리 -> 불가능
else if(o_win==0 && x_win==0) return 1; //무승부 또는 판이 진행중 -> 가능
return 1; //그 외 모두 가능
}
|
cs |
반응형
'알고리즘 문제풀이' 카테고리의 다른 글
[Programmers] 프로그래머스 Lv.2 n^2 배열 자르기 문제풀이(C++) - 월간 코드 챌린지 시즌3 (0) | 2023.09.19 |
---|---|
[Programmers] 프로그래머스 Lv.3 부대복귀 문제풀이(C++) (0) | 2023.09.12 |
[Programmers] 프로그래머스 Lv.2 무인도 여행 문제풀이(C++) (0) | 2023.09.08 |
[Programmers] 프로그래머스 Lv.3 연속 펄 부분 수열의 합 문제풀이(C++) (0) | 2023.09.07 |
[Programmers] 프로그래머스 Lv.2 연속된 부분 수열의 합 문제풀이(C++) (0) | 2023.09.06 |