반응형
파이썬으로 코딩테스트 연습하기
https://school.programmers.co.kr/learn/courses/30/lessons/160585
Solution
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
|
import re
def findOX(board, pattern) :
'''
count O or X in board
pattern : "O" or "X"
'''
return sum([len(re.findall(pattern, i)) for i in board])
def isEnd(board, pattern) :
'''
종료가 가능한 경우의 수 return
pattern : "O" or "X"
'''
rows = dict() # OOO 확인
for j in range(3) :
rows[j] = [i for i in range(3) if board[j][i] == pattern]
rowEnd = sum([1 for i in range(3) if len(rows[i])==3])
colEnd = sum([1 for i in range(3) if (i in rows[0]) & (i in rows[1]) & (i in rows[2])])
crossEnd = (sum([1 for i in range(3) if i in rows[i]]) == 3) + (sum([1 for i in range(3) if (2-i) in rows[i]]) == 3)
return([rowEnd, colEnd, crossEnd])
def solution(board) :
Ocnt = findOX(board, "O")
Xcnt = findOX(board, "X")
Oend = isEnd(board, "O")
Xend = isEnd(board, "X")
if (Ocnt - Xcnt < 0) | (Ocnt - Xcnt > 1) :
return(0)
elif (Oend[0] > 1) or (Oend[1] > 1) or (Xend[0] > 1) or (Xend[1] > 1) :
return(0)
elif (sum(Oend)>=1) & (Ocnt <= Xcnt) :
return(0)
elif (sum(Xend)>=1) & (Ocnt != Xcnt) :
return(0)
else :
return(1)
|
cs |
이 문제는 나올 수 없는 경우의 수를 잘 정의하는 것이 핵심이다.
1. "O"가 선공, "X"가 후공이므로 보드에서 ("O"의 개수) - ("X"의 개수) 는 1보다 작거나 같아야 하며, "X
의 개수가 더 많으면 안된다.
2. row나 col만은 여러번 성공할 수 없다.
즉, 아래 이미지처럼 대각선이 아니라 직선 형태로는 한 번 성공하면 그대로 종료이다.
단, 아래와 같이 row + 대각선, col + 대각선, 대각선 + 대각선 형태는 중복 성공이 가능하다.
왜나면 아래와 같이 겹치는 Cell을 가장 마지막에 놓는 경우엔 중복이어도 승리할 수 있기 때문이다.
3. "O"가 승리했을 땐 "O"의 개수가 "X"의 개수보다 딱 한개 더 많아야 한다.("O"가 선공이므로)
4. "X"가 승리했을 땐 "O"의 개수와 "X"의 개수가 일치해야한다.("X"가 후공이므로)
위 코드에서 findOX()는 보드에서 O 또는 X의 개수를 return해주고,
isEnd()는 입력해준 pattern(O or X)이 row로 승리한 개수, col로 승리한 개수, 대각선으로 승리한 개수를 list형태로 return한다.
반응형
'코딩테스트 연습 > 프로그래머스' 카테고리의 다른 글
[Python - 프로그래머스] 타겟 넘버 (0) | 2023.08.07 |
---|---|
[Python - 프로그래머스] 대충 만든 자판 (0) | 2023.07.07 |
[Python - 프로그래머스] 달리기 경주 (2) | 2023.06.16 |
[Python - 프로그래머스] 두 원 사이의 정수 쌍 (0) | 2023.06.15 |
[Python - 프로그래머스] 요격시스템 (0) | 2023.06.15 |