-
[SWEA / Python] 스도쿠 검증 | 초코더알고리즘/SW Expert Academy 2020. 8. 18. 01:49
문제
스도쿠가 잘 이루어져있는지 검사하는 알고리즘을 짜야합니다.
가로,세로,3x3에서 같은 숫자가 없으면 스도쿠가 잘 되어있는것.
접근법
1. 가로로 검사해주는 함수
2. 세로로 검사해주는 함수
3. 3x3을 검사해주는 함수
를 각각 구현하여서
모두 True가 나오면 1을 프린트
그렇지 않으면 0을 프린트 해준다.
느낀점
가로와 세로는 늘 구현하던것처럼 해주어서 쉬웠는데 3x3을 어떻게 구현해야할지 꽤 고민했습니다.
저는 복잡하지만,, 단순하게? 구현해보았습니다.
3x3의 정사각형은 총9개 있습니다.
우선 하나의 3x3은 아래와 같이 구현합니다.
for i in range(3): for j in range(3): maps[i][j]
그리고 각 시작점 (0,0),(3,0),(6,0) 에 대해 검사를 해주어야 하므로 아래와 같이 구현합니다.
(0,3),(3,3),(6,3)
(0,6),(3,6),(6,6)
각각 x,y좌표가 3씩 증가해서 6까지만 증가하므로 2중포문을 만들어주었고 범위는 (0,7,3)으로 주었습니다.
for x in range(0,7,3): for y in range(0,7,3): for i in range(3): for j in range(3): maps[i+x][j+y]
전체코드
import sys maps=[list(map(int,[p for p in sys.stdin.readline().split()])) for _ in range(9)] #가로 def hori(): ans=0 for i in range(9): nums = list(range(1, 10)) cnt = 0 for j in range(9): if maps[i][j] in nums: nums.remove(maps[i][j]) cnt+=1 else: return False if cnt==9: ans+=1 if ans==9: #print('가로','True') return True return False #세로 def verti(): ans=0 for i in range(9): nums = list(range(1, 10)) cnt=0 for j in range(9): if maps[j][i] in nums: nums.remove(maps[j][i]) cnt+=1 else: return False if cnt==9: ans+=1 if ans == 9: #print('세로', 'True') return True return False #3x3 def bythree(): ans=0 for x in range(0,7,3): for y in range(0,7,3): nums = list(range(1, 10)) cnt=0 for i in range(3): for j in range(3): if maps[i+x][j+y] in nums: nums.remove(maps[i+x][j+y]) cnt+=1 if cnt==9: ans+=1 if ans==9: #print('3x3', 'True') return True return False if hori() and verti() and bythree(): print(1) else: print(0)