본 내용은 파이썬 알고리즘 문제풀이 (코딩테스트 대비) 강의를 토대로 작성하였습니다.

# 스도쿠 검사
import sys
#sys.stdin=open("input.txt", "r")
a = [list(map(int, input().split())) for _ in range(9)]
chk_num = [0]*9
def check(a):
# 각 행과 열을 비교
for i in range(9):
ch1 = ch2 = 0
for j in range(9):
#행 a[i][j] , 열 a[j][i]
ch1 +=a[i][j]
ch2 +=a[j][i]
if ch1 != 45 or ch2 != 45:
return False
# 3*3 박스 비교
for i in range(3):
for j in range(3):
ch3 = 0
for k in range(3):
for s in range(3):
ch3 += a[i*3+k][j*3+s]
if ch3 != 45:
return False
return True
if check(a):
print("YES")
else:
print("NO")
열심히 머리 굴리면서 풀었는데 땡이다.
fail 케이스를 찾아보니 아래와 같다.
2+4+9+3+4+7+2+6+8
=> 얘도 합이 45..
숫자도 중복이고 빠진값도 있는데 절묘하게도 합이 45다.
구글링을 해보니 위와 같은 케이스때문에
대부분 1~9 까지의 합으로 판별을 하지않는다.
# 스도쿠 검사
import sys
#sys.stdin=open("input.txt", "r")
a = [list(map(int, input().split())) for _ in range(9)]
def check(a):
# 각 행과 열을 비교
for i in range(9):
ch1 = ch2 = [0]*10
for j in range(9):
#행 a[i][j] , 열 a[j][i]7
ch1[a[i][j]] = 1
ch2[a[j][i]] = 1
if sum(ch1) != 9 or sum(ch2) != 9:
return False
# 3*3 박스 비교
for i in range(3):
for j in range(3):
ch3 = [0]*10
for k in range(3):
for s in range(3):
ch3[a[i*3+k][j*3+s]] = 1
if sum(ch3) != 9:
return False
return True
if check(a):
print("YES")
else:
print("NO")
강사님의 코드로 이해하였다.
1~9 까지의 합 대신 숫자가 나오면 1로 변경 후 비교 처리 하는 코드.
이외에 set 을 이용해 처리하는 방법도 있음
'Algorithm > 파이썬 알고리즘 문제풀이' 카테고리의 다른 글
[python/inflearn/section3] 봉우리 (0) | 2022.10.05 |
---|---|
[python/inflearn/section3] 곳감(모래시계) (0) | 2022.09.25 |
[python/inflearn/section3] 사과나무(다이아몬드) (1) | 2022.09.25 |
[python/inflearn/section3] 격자판 최대합 (1) | 2022.09.25 |
[python/inflearn/section3] 수들의 합 (0) | 2022.09.22 |