[BOJ] 2239 스도쿠

2021. 8. 5. 19:39· Koala - 4기

검사해야 할 것들은 주어진 좌표의 가로줄, 세로줄 그리고 스도쿠 판을 9개로 나누었을때 속해있는 그 칸의 9개의 나머지 블럭들 이 3가지입니다.

사실 그냥 시간을 전혀 신경쓰지않는다면 간단하게 정답을 구할 수 있지만 문제의 경우는 다음이라고 생각했습니다.

# 이것만 오래 안걸리면 나머지 다 맞을듯
'''
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
'''

 위의 테스트 케이스만 빠르게 해결할 정도라면 문제를 맞추는 것은 어렵지 않다고 생각했고, 이것으로 계속 테스트를 해보았습니다.

 

sector=[[] for i in range(9)]

for x in range(9):
    for y in range(9):
        sector[3*(y//3)+x//3].append((x,y))
0 1 2
3 4 5
6 7 8

일단 이렇게 9개의 좌표값을 갖는 구역 0~8까지를 만들어주었습니다.

 

이 구역을 활용해서 이 위치에 들어올수 있는 값들의 배열을 얻는 함수를 만들어주었습니다.

def check(x,y):
    to_check=[1]*10
    for X,Y in sector[3*(y//3)+x//3]:
        to_check[sdoku[Y][X]]=0

    for l in range(9):
        to_check[sdoku[l][x]]=0
        to_check[sdoku[y][l]]=0 
    return to_check

크기가 10(1+9)인 배열을 만들어주고 같은 x,  같은y 그리고 같은 sector에 속해있는 값들을 비교해서 들어올수 없는 값의 위치를 0으로 바꾸어 준 뒤 배열을 전달해주었습니다.

def dfs(x):
    X,Y=locate[x]
    able=check(X,Y)
    for i in range(1,10):
        if able[i]==1:
            sdoku[Y][X]=i
            dfs(x+1)
            sdoku[Y][X]=0

이제 dfs로 가능한 배열들을 돌려주기만 하면 됩니다!

import sys
input=sys.stdin.readline

sdoku=[list(map(int,input().split())) for i in range(9)]
sector=[[] for i in range(9)]

for x in range(9):
    for y in range(9):
        sector[3*(y//3)+x//3].append((x,y))

def dfs(x):
    X,Y=locate[x]
    able=check(X,Y)
    for i in range(1,10):
        if able[i]==1:
            sdoku[Y][X]=i
            dfs(x+1)
            sdoku[Y][X]=0
            
def check(x,y):
    to_check=[1]*10
    for X,Y in sector[3*(y//3)+x//3]:
        to_check[sdoku[Y][X]]=0

    for l in range(9):
        to_check[sdoku[l][x]]=0
        to_check[sdoku[y][l]]=0 
    return to_check

locate=[]
for i in range(9):
    for j in range(9):
        if sdoku[i][j]==0:
            locate.append((j,i))
try:
    dfs(0)
except:
    for i in range(9):
        print(*sdoku[i])

dfs를 진행하다 만약 x값이 너무 커지게 되면 오류가 나고, 그 시점에는 이미 스도쿠가 완성되어 있으므로 출력해주었습니다.

이 문제를 한 달전에 제가 풀었었더라고요,,

오늘,
한달전

코드도 엄청 짧아지고 시간도 많이 빨라진 것을 보니 기분이 좋네요 ㅎㅎ

 

pypy3기준 백트래킹으로 풀 경우 걸리는 시간이라 적혀있는데, 같은 코드를 제출했을 때 파이썬은 84%에서 시간 초과가 나는데 고칠 방법을 모르겠네요 ㅠ..

저작자표시 (새창열림)

'Koala - 4기' 카테고리의 다른 글

[BOJ] 1062 가르침  (0) 2021.08.06
[BOJ] 16197 두 동전  (0) 2021.08.05
[BOJ] 백준 스도쿠 2239번  (0) 2021.08.05
[BOJ 2239번] : 스도쿠  (2) 2021.08.05
8/3 모의 테스트 풀이 ppt  (0) 2021.08.04
'Koala - 4기' 카테고리의 다른 글
  • [BOJ] 1062 가르침
  • [BOJ] 16197 두 동전
  • [BOJ] 백준 스도쿠 2239번
  • [BOJ 2239번] : 스도쿠
KauKoala
KauKoala
항공대 알고리즘 동아리 Koala 🥰
KauKoala
Koala
KauKoala
전체
오늘
어제
  • 분류 전체보기 (1883)
    • 공지 게시판 (10)
    • 정보 게시판 (8)
    • Codeforce (15)
    • acm-icpc (6)
    • Koala - 1기 (16)
    • Koala - 2기 (111)
      • Programming Contest (1)
      • A반 (20)
      • B반 (39)
      • C반 (22)
      • 기초 강의 (18)
    • Koala - 3기 (10)
      • 기초 스터디 (7)
    • Koala - 4기 (67)
    • Koala - 5기 (144)
      • 기초 알고리즘 스터디 (75)
      • 코딩테스트 준비 스터디 (68)
    • Koala - 6기 (102)
      • 기초 알고리즘 스터디 (75)
      • 코딩테스트 준비 스터디 (25)
      • 모의 테스트 스터디 (1)
    • Koala - 7기 (167)
      • 기초 알고리즘 스터디 (97)
      • 코딩테스트 준비 스터디 (68)
      • 모의 테스트 스터디 (1)
    • Koala - 8기 (44)
      • 기초 알고리즘 스터디 (32)
      • 코딩테스트 준비 스터디 (10)
      • 코드포스 버츄얼 스터디 (0)
      • 프로그래머스 LV2 스터디 (0)
    • Koala - 9기 (205)
      • 기초 알고리즘 스터디 (138)
      • 코딩테스트 준비 스터디 (64)
      • 모의테스트 준비 스터디 (1)
    • Koala - 10기 (117)
      • 기초 알고리즘 스터디 (30)
      • 코딩테스트 준비 스터디 (86)
      • 모의테스트 준비 스터디 (1)
    • Koala - 11기 (151)
      • 기초 알고리즘 스터디 (46)
      • 코딩테스트 준비 스터디 (104)
      • 모의테스트 준비 스터디 (1)
    • Koala - 12기 (86)
      • 기초 알고리즘 스터디 (31)
      • 코딩테스트 준비 스터디 (55)
    • Koala - 13기 (119)
      • 기초 알고리즘 스터디 (52)
      • 코딩테스트 준비 스터디 (67)
    • Koala - 14기 (116)
      • 기초 알고리즘 스터디 (39)
      • 코딩테스트 준비 스터디 (77)
    • Koala - 15기 (138)
      • 기초 알고리즘 스터디 (73)
      • 코딩테스트 준비 스터디 (65)
    • Koala - 16기 (47)
      • 코딩테스트 기초 스터디 (16)
      • 코딩테스트 심화 스터디 (31)
    • Koala - 17기 (62)
      • 코딩테스트 기초 스터디 (15)
      • 코딩테스트 심화 스터디 (47)
    • Koala - 18기 (31)
      • 코딩테스트 기초 스터디 (11)
      • 코딩테스트 심화 스터디 (20)
    • Koala - 19기 (38)
      • 코딩테스트 기초 스터디 (7)
      • 코딩테스트 심화 스터디 (31)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 🐨항공대 알고리즘 학회 Koala 3기 모집
  • 🐨항공대 알고리즘 학회 Koala 2기 모집
  • 소모임 소개

인기 글

태그

  • 백준
  • dfs
  • BFS
  • C++
  • dp
  • 파이썬
  • BOJ
  • 백트래킹

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.3.0
KauKoala
[BOJ] 2239 스도쿠
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.