Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Lv. 0
- Lv. 2
- Dynamic Programming
- level 3
- group by
- programmers
- SQL 고득점 KIT
- 자바스크립트
- softeer
- 너비 우선 탐색
- 프로그래머스
- 티스토리챌린지
- bfs
- C언어
- dfs
- Lv. 3
- select
- 깊이 우선 탐색
- 소프티어
- SQL
- Python
- DP
- 파이썬
- Lv. 1
- javascript
- LEVEL 2
- join
- 오블완
- 동적계획법
- Java
Archives
- Today
- Total
몸과 마음이 건전한 SW 개발자
프로그래머스 [Lv. 2] 혼자서 하는 틱택토 {언어 : Python} [반례 포함] 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/160585
정답 코드
def solution(board):
# O의 개수 X의 개수
cntO = 0
cntX = 0
# 누가 이겼는지
winO = [0]
winX = [0]
def whoWin(who):
if who == "X":
winX[0] += 1
else:
winO[0] += 1
return
#개수 새기
for i in range(3):
for j in range(3):
tmp = board[i][j]
if tmp == ".":
continue
elif tmp == "X":
cntX += 1
else:
cntO += 1
# 가로 탐색
for i in range(3):
cnt = 1
who = board[i][0]
if who == ".":
continue
for j in range(1, 3):
nextWho = board[i][j]
if who == nextWho:
cnt += 1
if cnt == 3:
whoWin(who)
# 세로 탐색
for l in range(3):
cnt = 1
who = board[0][l]
if who == ".":
continue
for m in range(1, 3):
nextWho = board[m][l]
if who == nextWho:
cnt += 1
if cnt == 3:
whoWin(who)
# 대각선 탐색
cross = board[1][1]
if cross != ".":
if cross == board[0][0] and cross == board[2][2]:
whoWin(cross)
if cross == board[0][2] and cross == board[2][0]:
whoWin(cross)
answer = 0
# 가능한지 판단
if winO[0] == 1 and winX[0] == 0 and cntO == cntX + 1:
answer = 1
elif winX[0] == 1 and winO[0] == 0 and cntX == cntO:
answer = 1
elif cntO == 0 and cntX == 0:
answer = 1
elif winO[0] == 0 and winX[0] == 0:
if cntO == cntX or cntO == cntX + 1:
answer = 1
elif winO[0] == 2 and cntO == 5 and cntX == 4:
answer = 1
return answer
풀이 방법
- X와 O의 개수를 탐색
- 가로 세로 대각선을 순회하여 누가 몇 번 이겼는지 탐색
- 5가지의 경우만 가능한 경우로 판단된다.
- O의 빙고 개수가 1인 경우 X는 0이어야 하며 선공이므로 X보다 1 많아야 한다.
- X의 빙고 개수가 1인 경우 O는 0이어야 하며 후공이므로 O와 개수가 같아야 한다.
- 아무것도 없는 경우
- 아무도 이기지 못한 경우
- X와 O의 개수가 같을 수도 있다.
- X가 둬야 하는 차례에 끝난 경우 O보다 1개 적을 수 있다.
- 반례의 상황과 같다.
- 위의 경우의 수에서 멈추지 않는 경우 answer는 초기값인 0을 반환한다.
반례
board: ["OXO", "XOX", "OXO"] result: 1 |
느낀점
- 노가다 문제인데 반례를 떠올리지 못하면 못 푼다...
- 아쉽다.
'알고리즘' 카테고리의 다른 글
프로그래머스 [Lv. 2] 호텔 대실 {언어 : Python} [heap X] (0) | 2024.04.14 |
---|---|
프로그래머스 [Lv. 2] 미로 탈출 {언어 : JavaScript} (0) | 2024.04.14 |
프로그래머스 [Lv. 2] 당구 연습 {언어 : JavaScript} (0) | 2024.04.11 |
프로그래머스 [Lv. 2] 리코쳇 로봇 {언어 : JavaScript} (0) | 2024.04.10 |
프로그래머스 [Lv. 2] 광물 캐기 {언어 : Python} (0) | 2024.04.09 |