[SWEA / Python] 1974. 스도쿠 검증

띵슈롱·2023년 10월 26일
0

PS(Problem Solving)

목록 보기
16/17

문제

접근 방법

스토쿠를 검증하는 문제로 가로, 세로 3*3 크기의 각 합이 1~9까지 다 더한 45면 참이다 라고 처음 생각했다.

문제 풀이

# import sys

# sys.stdin = open("input/1974_input.txt")vv

t = int(input())

for cnt in range(1, t + 1):
    arr = [list(map(int, input().split())) for _ in range(9)]

    # 가로 검사
    for i in range(9):
        temp = 0
        temp = sum(arr[i])
        if temp != 45:
            break
    if temp != 45:
        print(f"#{cnt} 0")
        continue

    # 세로 검사
    for i in range(9):
        temp = 0
        for j in range(9):
            temp += arr[j][i]

        if temp != 45:
            break

    if temp != 45:
        print(f"#{cnt} 0")
        continue

    # 3*3 cheak
    if cnt % 3 == 1:
        temp = 0
        for i in range(cnt - 1, cnt + 2):
            for j in range(cnt - 1, cnt + 2):
                temp += arr[i][j]

        if temp != 45:
            break
    if temp != 45:
        print(f"#{cnt} 0")
        continue
    else:
        print(f"#{cnt} 1")

이렇게 풀었는데 계속 오류가 떠서 생각해보니
내 알고리즘상 무작위 숫자를 넣어서 45만 되면 pass가 되기 때문에 잘 못된 풀이였다.

그래서 가로, 세로, 3x3 안에 각 요소의 수가 2개 이상이면 0출력 아니면 통과하는 식으로 다시 풀어야 겠다고 생각했다.

최종 코드

import sys

sys.stdin = open("input/1974_input.txt")

t = int(input())

for cnt in range(1, t + 1):
    arr = [list(map(int, input().split())) for _ in range(9)]
    state = 1
    # 가로 검사
    for i in range(1, 10, 1):
        for j in range(1, 10, 1):
            if arr[i - 1].count(j) >= 2:
                state = 0
                break
        if state == 0:
            break

    # 세로 검사
    for i in range(9):
        temp = []
        for j in range(9):
            temp.append(arr[j][i])

        for k in range(1, 10):
            if temp.count(k) >= 2:
                state = 0
                break

        if state == 0:
            break

    # 3*3 check
    for _ in range(0, 9, 3):
        temp = []
        for a in range(3):
            for b in range(3):
                temp.append(arr[a][b])

        for k in range(1, 10):
            if temp.count(k) >= 2:
                state = 0
                break

    if state == 0:
        print(f"#{cnt} 0")

    else:
        print(f"#{cnt} 1")

합이 아닌 가로줄, 세로줄 3*3 의 값을 배열로 받아 count를 해 2개 이상이면 F 아니면 T로 해결했다.

profile
어떻게 하는겨?

0개의 댓글