728x90
문제)
스도쿠는 일본어로 "수독(數獨)"을 읽은 것이다. 이는 미국에서 유명한 일본의 한 퍼즐 이름이기도 하다. 스도쿠는 9x9 격자판에 다음 조건을 만족하여 수를 채워 넣는 게임이다.
- 각 정수 1-9는 각 행에 정확히 한 번씩 등장해야 한다.
- 각 정수 1-9는 각 열에 정확히 한 번씩 등장해야 한다.
- 각 정수 1-9는 각 작은 3x3 정사각형에 정확히 한 번씩 등장해야 한다.
남규는 스도쿠에 푹 빠져서 하루종일 스도쿠 문제를 풀던 와중, 스도쿠를 풀었지만 그것이 정답인지를 쉽게 확인할 수 없어 고민에 빠졌다. 불쌍한 남규를 위해 다 채워진 스도쿠 판이 올바른 답인지 판별하는 프로그램을 작성해 주자.
입력)
입력의 첫 줄에는 테스트 케이스의 개수가 주어진다.
각 테스트 케이스는 9개의 줄로 이루어져 있으며, 각 줄에는 9개의 정수가 공백으로 구분되어 있다. 각 정수는 1 이상 9 이하이다. 테스트 케이스의 사이에는 빈 줄이 하나 있다.
테스트 케이스의 개수는 100개를 넘지 않는다.
출력)
각 테스트 케이스에 걸쳐 "Case x:"를 출력한 후, 공백 한 칸 뒤에 풀이가 올바르면 "CORRECT"를, 아니면 "INCORRECT"를 출력한다. x는 테스트 케이스 번호이며, 1부터 시작한다.
from sys import stdin
rd = stdin.readline
def check_line(line):
return len(set(line)) == 9
def check_square(board, r, c):
square = [board[r+i][c+j] for i in [0, 1, 2] for j in [0, 1, 2]]
return len(set(square)) == 9
T = int(rd())
for t in range(1, T+1):
sudoku = [rd().split() for _ in range(9)]
correct = True
for row in sudoku:
if not check_line(row):
correct = False
break
if correct:
for col in zip(*sudoku):
if not check_line(col):
correct = False
break
if correct:
for n in range(0, 7, 3):
for m in range(0, 7, 3):
if not check_square(sudoku, n, m):
correct = False
break
if not correct:
break
answer = "CORRECT" if correct else "INCORRECT"
print(f"Case {t}: {answer}")
if t < T:
rd()
풀이 :
모든 행과 열, 3x3 사각형에 중복되는 숫자가 있으면 안된다는 것을 이용하기 위해 중복을 제거해주는 set함수를 사용하였다. 행과 열에 대한 정보를 set함수에 넣은뒤 그 결과값의 길이가 9보다 작다면 중복되는 숫자가 존재하는 것으로 스도쿠는 정답이 아니게 된다. 그 후에 각 사각형에 대한 정보를 set함수에 넣어서 길이를 확인한 뒤 최종 결과를 출력해준다.
'코딩 공부 > 파이썬' 카테고리의 다른 글
백준) 16928 - 뱀과 사다리 게임 [파이썬3] (0) | 2023.01.25 |
---|---|
백준) 11286 - 절댓값 힙[파이썬3] (0) | 2023.01.15 |
백준) 7576 - 토마토 [파이썬3] (0) | 2022.12.25 |
프로그래머스) 방문 길이 [파이썬3] (0) | 2022.12.21 |
프로그래머스) [1차] 프렌즈4블록 [파이썬3] (0) | 2022.12.20 |