3 분 소요

사용 언어: Python3

문제

스크린샷 2023-04-17 오후 3 27 59

풀이

내 풀이

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_groupsum()을 이용해 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_groupsum() 사용
    • 각 리스트의 합이 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 그룹 순회


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기