[김태원 알고리즘] 스토쿠 검사
사용 언어: Python3
문제
풀이
내 풀이
def checkGroup(src, board):
global ck
for _ in range(3):
# print('src={}'.format(src))
x, y = src//9, src%9 # ✅ src -> (x, y) 변환
tmp = set() # ✅ set() 사용
for i in range(3):
for j in range(3):
tmp.add(board[x+i][y+j])
if len(tmp) != 9: # ✅
ck = False
return
src += 3
board = [list(map(int, input().split())) for _ in range(9)]
ck = True
# 행 검사
# if all(len(set(row)) == 9 for row in board):
# pass
# else:
# ck = False
for row in board:
if len(set(row)) != 9:
ck = False
break
# 열 검사
for j in range(9):
tmp = set()
for i in range(9):
tmp.add(board[i][j])
if len(tmp) != 9:
ck = False
break
# 그룹(3*3) 검사
# 0 ~ 80까지 -> 0 ~ N^2-1 까지로
# 시작 인덱스: 0,3,6, 27,30,33, 54,57,60
# 0 -> 27 -> 54
for src in range(0, 81, 27):
checkGroup(src, board)
if ck:
print('YES')
else:
print('NO')
- 성공!
- 그룹을 체크할 때, 4중 for문을 사용하는 대신 (0 ~ 80)을 (0 ~ N^2-1)으로 보고 3중 for문 사용
set()
을 이용해 1부터 9까지 모든 수가 들어왔는지 체크
다른 풀이 - 1
def checkGroup(src, board):
global ck
for _ in range(3):
# print('src={}'.format(src))
x, y = src//9, src%9 # ✅ src -> (x, y) 변환
ck_group = [0] * 10
for i in range(3):
for j in range(3):
ck_group[board[x+i][y+j]] = 1 # ✅ ck_group 리스트 사용
if sum(ck_row) != 9:
ck = False
return
src += 3
board = [list(map(int, input().split())) for _ in range(9)]
ck = True
# 행 검사
for row in board:
ck_row = [0] * 10
for val in row:
ck_row[val] = 1
if sum(ck_row) != 9:
ck = False
# 열 검사
if ck:
for j in range(9):
ck_col = [0] * 10
for i in range(9):
ck_col[board[i][j]] = 1
if sum(ck_row) != 9:
ck = False
# 그룹 검사
if ck:
for src in range(0, 81, 27):
checkGroup(src, board)
if ck:
print('YES')
else:
print('NO')
ck_group
과sum()
을 이용해 1부터 9까지 모든 수가 들어왔는지 체크- 리스트의 합이 9라면 1부터 9까지의 수가 모두 나온 것!
다른 풀이 - 2
def check(board):
# 행과 열 동시 체크
for i in range(9):
ck_row = [0]*10
ck_col = [0]*10
for j in range(9):
ck_row[board[i][j]] = 1 # ✅ ck_row 리스트 사용
ck_col[board[j][i]] = 1 # ✅ ck_col 리스트 사용
if sum(ck_row) != 9 or sum(ck_col) != 9:
return False
return True
# 그룹 체크
def checkGroup(src, board):
for _ in range(3):
# print('src={}'.format(src))
x, y = src//9, src%9 # ✅ src -> (x, y) 변환
tmp = set()
for i in range(3):
for j in range(3):
tmp.add(board[x+i][y+j])
if len(tmp) != 9:
return False
src += 3
return True
board = [list(map(int, input().split())) for _ in range(9)]
if not check(board):
print('NO')
else:
if all(checkGroup(src, board) for src in range(0, 81, 27)):
print('YES')
else:
print('NO')
- 행과 열과 그룹을 체크하는
ck_row
,ck_col
,ck_group
과sum()
사용- 각 리스트의 합이 9라면 1부터 9까지의 수가 모두 나온 것!
- 행과 열을 동시에 체크
- 그룹을 체크할 때, 4중 for문을 사용하는 대신 (0 ~ 80)을 (0 ~ N^2-1)으로 보고 3중 for문 사용
다른 풀이 - 3
def check(board):
# 행과 열 동시 체크
for i in range(9):
ck_row = [0]*10
ck_col = [0]*10
for j in range(9):
ck_row[board[i][j]] = 1 # ✅ ck_row 리스트 사용
ck_col[board[j][i]] = 1 # ✅ ck_col 리스트 사용
if sum(ck_row) != 9 or sum(ck_col) != 9:
return False
# 그룹 체크 # ✅ 4중 for문
for i in range(3):
for j in range(3):
ck_group = [0]*10
for k in range(3):
for s in range(3):
ck_group[board[i*3+k][j*3+s]] = 1
if sum(ck_group) != 9:
return False
return True
board = [list(map(int, input().split())) for _ in range(9)]
if check(board):
print('YES')
else:
print('NO')
- 그룹을 체크할 때, 4중 for문 사용
ck_group[board[i*3+k][j*3+s]]
으로 3*3 그룹 순회
💛 개인 공부 기록용 블로그입니다. 👻