반응형
프로그래머스 Level 2 혼자서 하는 틱택토
https://school.programmers.co.kr/learn/courses/30/lessons/160585
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1차 풀이
가로, 세로, 대각선으로 나눠서 빙고를 따져보았다
"""
3x3 선공 o, 후공 x
가로, 세로, 대각선 중 하나라도 같은 표시이면 승리
실수 : 잘못 표시, 이미 게임 끝남
정답 = 1, 오답 = 0
"""
def solution(board):
answer = -1
win = 0
count = 0
# 승부가 이미 났을 경우 따지기
for i in board:
#print(i)
# 가로
if i[0] == i[1] == i[2] and i[0] != '.':
print(i)
win += 1
# 선공 후공 따지기
for j in i:
if j == "O":
count += 1
elif j == "X":
count -= 1
#print(count)
if win > 1 or count < 0 or count > 1:
answer = 0
else:
answer = 1
return answer
2차 풀이
아오 이거 너무 짜증나는 문제임 ㄹㅇ

"""
3x3 선공 o, 후공 x
가로, 세로, 대각선 중 하나라도 같은 표시이면 승리
실수 : 잘못 표시, 이미 게임 끝남
정답 = 1, 오답 = 0
"""
def solution(board):
answer = -1
win = 0
count = 0 # 선공 후공 따지기
deL = 0
deR = 0
# 승부가 이미 났을 경우 따지기
for i in range(len(board)):
ga = 0
se = 0
#print(board[-(i+1)])
if board[i][i] == "O":
deL += 1
elif board[i][i] == "X":
deL -= 1
if board[i][-(i+1)] == "O":
deR += 1
elif board[i][-(i+1)] == "X":
deR -= 1
for j in range(len(board)):
# 가로
if board[i][j] == "O":
ga += 1
count += 1
elif board[i][j] == "X":
ga -= 1
count -= 1
# 세로
if board[j][i] == "O":
se += 1
elif board[j][i] == "X":
se -= 1
if abs(se) == 3:
win += 1
if abs(ga) == 3:
win += 1
if abs(deL) == 3 or abs(deR) == 3:
win += 1
print(win, count, se, ga)
# 마지막에 2개 빙고 넣을 경우
if win == 2 and count == 1 and (abs(deR) == 3 or abs(deL) == 3) :
answer = 1
elif win == 2 and count == 1 and (se == -1 or se == 3):
answer = 1
elif win >= 1 or count < 0 or count > 1:
answer = 0
else:
answer = 1
return answer
3차 풀이
그냥 노가다로 풀어버렸다....
정말 좋지 않은 코드의 예시인듯
근데 다른 사람의 풀이를 보았는데 의외로 다들 살짝 노가다로 풀었다
"""
3x3 선공 o, 후공 x
가로, 세로, 대각선 중 하나라도 같은 표시이면 승리
실수 : 잘못 표시, 이미 게임 끝남
정답 = 1, 오답 = 0
"""
def solution(board):
answer = -1
win = 0
lose = 0
count = 0 # 선공 후공 따지기
deL = 0
deR = 0
# 승부가 이미 났을 경우 따지기
for i in range(len(board)):
ga = 0
se = 0
#print(board[-(i+1)])
if board[i][i] == "O":
deL += 1
elif board[i][i] == "X":
deL -= 1
if board[i][-(i+1)] == "O":
deR += 1
elif board[i][-(i+1)] == "X":
deR -= 1
for j in range(len(board)):
# 가로
if board[i][j] == "O":
ga += 1
count += 1
elif board[i][j] == "X":
ga -= 1
count -= 1
# 세로
if board[j][i] == "O":
se += 1
elif board[j][i] == "X":
se -= 1
if se == 3 or ga == 3:
win += 1
elif se == -3 or ga == -3:
lose += 1
if deL == 3 or deR == 3:
win += 1
elif deL == -3 or deR == -3:
lose += 1
#print(win, count, se, ga)
# 마지막에 2개 빙고 넣을 경우
if win == 0 and (count == 1 or count == 0) and lose != 1:
answer = 1
elif lose == 1 and count == 0 and win == 0:
answer = 1
elif win == 1 and count == 1 and lose != 1:
answer = 1
elif win == 2 and count == 1 :
answer = 1
else:
answer = 0
return answer
반응형
'코딩 테스트 > Programmers' 카테고리의 다른 글
[Python] [Level 2] 호텔 대실 (lambda 함수 활용하기, 모두 분(分)으로 바꾸기) (0) | 2023.03.11 |
---|---|
[Python] [Level 2] 타겟 넘버 (깊이/너비 우선 탐색[DFS/BFS]) ... BFS로 풀기 (0) | 2023.03.11 |
[Python] [Level 2] 덧칠하기 (파이썬 tmp 활용하기) (0) | 2023.03.10 |
[Python] [Level 2] 할인 행사 (dictionary로 풀기) (0) | 2023.03.08 |
[Python] [Level 2] 피로도 (완전 탐색) (itertools 라이브러리permutation 순열로 풀기) (0) | 2023.03.07 |