[백준] 2580 스도쿠

파이톨치·2022년 8월 9일
0

백준

목록 보기
7/12

코드

시간 초과

import sys

# 입력 받기
board = []
for i in range(9):
    board.append(list(map(int, sys.stdin.readline().rstrip().split())))

# 0의 개수는? 
def zeros(board):
  missing_num = 0
  for line in board:
    missing_num += line.count(0)
  return missing_num

# 가로 채워보기
def fill_width(board):
  for line in board:
    missing_num = line.count(0)
    if missing_num == 1:
        answer = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        for num in line:
          if num != 0:
            answer.remove(num)
        idx = line.index(0)
        line[idx] = answer[0]

# 세로 채워보기
def fill_vertical(board):
  for i in range(9):
    line = ([t[i] for t in board])
    missing_num = line.count(0)
    
    if missing_num == 1:
      answer = [1, 2, 3, 4, 5, 6, 7, 8, 9]
      for num in line:
        if num != 0:
          answer.remove(num)
      idx = line.index(0)
      board[idx][i] = answer[0]

# 정사각형 채우기
def fill_square(board):
  
  for i in range(0, 9, 3):
    for j in range(0, 9, 3):
      line = []
      for k in range(3):
        for r in range(3):
          line.append(board[i+k][j+r])
      #print(line)
      missing_num = line.count(0)
    
      if missing_num == 1:
        answer = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        for num in line:
          if num != 0:
            answer.remove(num)
        idx = line.index(0)
        
        board[i+(idx//3)][j+(idx % 3)] = answer[0]

# 전체 채워보기
while zeros(board) != 0:
  fill_width(board)
  fill_vertical(board)
  fill_square(board)
  
# 출력
for i in board:
  for j in i:
    print(j, end=" ")
  print()

시간 초과 이유 : 다시 생각해보면 너무 비효율적이다. 0인 것만 보면 되는데 쓸데없이 너무 많은 탐색을 한다.

문제 링크

https://www.acmicpc.net/problem/2580

profile
안알랴줌

0개의 댓글