728x90
반응형
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 문제
선공이 'O', 후공이 'X'이며 번갈아 가면서 표시하는 게임을 진행하고 있습니다.
현재 게임판의 상태가 주어질 때, 해당 게임판 상태가 가능한지 여부를 확인해보자
[입력]
틱택토 게임판의 정보를 담고 있는 문자열 배열 board
[출력]
가능한 게임판 상태이면 1을 아니라면 0을 return
2. 풀이
현 상태가 가능한지 판단하는 조건을 잘 구별하면 풀 수 있는 문제입니다.
2.1 O과 X의 개수
문제를 보면 O이 먼저 시작하고 그 이후에 X를 두어야 하므로 O의 개수는 반드시 X와 같거나 1 커야 합니다.
이를 코드로 표현하면
first, second = 0, 0 # 선공개수, 후공개수
for x in range(3):
for y in range(3):
if board[x][y] == 'O': first+=1
elif board[x][y] == 'X': second+=1
if first != second and first != second+1: return 0
if first == 0 and second == 0: return 1
🌹 입출력 예제 4번 처럼 O과 X가 모두 없을 때에는 반드시 가능하므로 1을 반환해주어아 합니다.
2.2 O가 이긴 상황일 때
O가 가로, 세로, 대각선 중 이미 3개를 모두 채운 경우에는 어떨때 불가능한 경우일까요?
O가 이긴 상황에서 X는 새로운 칸을 채울 수 없습니다. 따라서 O가 이겼을 때는 X의 개수가 O보다 크거나 같으면 안 됩니다.
# count_O는 하나의 가로,세로,대각선에서 O의 개수
if count_O == 3 and first <= second: return 0
2.3 X가 이긴 상황일 때
X가 가로, 세로, 대각선 중 이미 3개를 모두 채운 경우에는 O와 비슷하게 O의 개수가 X의 개수와 같아야 합니다.
X가 이긴 상황에서 O는 새로운 칸을 채울 수 없기 때문입니다.
# count_X는 하나의 가로, 세로, 대각선에서의 X의 개수
if count_X == 3 and first > second: return 0
위 3가지 경우를 코드롤 구현하면 아래와 같습니다. 🤗
3. 코드
Python
def solution(board):
first, second = 0, 0 # 선공개수, 후공개수
for x in range(3):
for y in range(3):
if board[x][y] == 'O': first+=1
elif board[x][y] == 'X': second+=1
if first != second and first != second+1: return 0
if first == 0 and second == 0: return 1
# row
for x in range(3):
count_O, count_X = 0, 0
for y in range(3):
if board[x][y] == 'O': count_O+=1
elif board[x][y] == 'X': count_X+=1
if count_O == 3 and first <= second: return 0
if count_X == 3 and first > second: return 0
# Column
for x in range(3):
count_O, count_X = 0, 0
for y in range(3):
if board[y][x] == 'O': count_O+=1
elif board[y][x] == 'X': count_X+=1
if count_O == 3 and first <= second: return 0
if count_X == 3 and first > second: return 0
# Dia
count_O, count_X = 0, 0
for x in range(3):
if board[x][x] == 'O': count_O+=1
elif board[x][x] == 'X': count_X+=1
if count_O == 3 and first <= second: return 0
if count_X == 3 and first > second: return 0
count_O, count_X = 0, 0
for x in range(3):
if board[x][-x-1] == 'O': count_O+=1
elif board[x][-x-1] == 'X': count_X+=1
if count_O == 3 and first <= second: return 0
if count_X == 3 and first > second: return 0
return 1
반응형
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스 > Lv1] 대충 만든 자판 (0) | 2023.03.04 |
---|---|
[프로그래머스 > Lv2] 덧칠하기 (0) | 2023.03.04 |
[프로그래머스 > Lv2] 미로탈출 (0) | 2023.02.16 |
[프로그래머스 > Lv1] 카드뭉치 (0) | 2023.02.16 |
[프로그래머스 > Lv3] 표현 가능한 이진트리 (0) | 2023.02.10 |