[Algorithm/Python][SWEA] 1974번 스도쿠 검증

동글이·2022년 11월 14일
0

Algorithm

목록 보기
33/33

[SWEA] 1974. 스도쿠 검증

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=1&problemLevel=2&contestProbId=AV5Psz16AYEDFAUq&categoryId=AV5Psz16AYEDFAUq&categoryType=CODE&problemTitle=&orderBy=RECOMMEND_COUNT&selectCodeLang=ALL&select-1=2&pageSize=10&pageIndex=2

- 문제 접근

  • 문법 :
    1) 2차원 배열 선언
    • 선언 후 0으로 초기화한 뒤 사용
    puzzle=[[0]*9 for _ in range(9)]
      for i in range(9):
          puzzle[i]=list(map(int, input().split()))
    • 선언과 동시에 사용
    puzzle=[list(map(int, input().split())) for _ in range(9)]
    2) 배열의 row에 list 형식으로 넣기
    puzzle[i]=list(map(int, input().split()))
    3) set(집합) 선언 + 집합 개수까지 구하기
    => 중복되는 수가 있나 없나 검증 가능(9개면 중복되는 수가 없는 것)
    len(set(col)) != 9
  • 예외상황을 발생시킬 수도 있는 경우의 수를 잘 고민해 보아야한다..!

- 내 코드

T = int(input())

for t in range(T):
    puzzle=[[0]*9 for _ in range(9)]
    for i in range(9):
        puzzle[i]=list(map(int, input().split()))
    for i in range(9):
        row = len(set(puzzle[i]))
        if row != 9:
            break
    for i in range(9):
        col = []
        for j in range(9):
            col.append(puzzle[j][i])
        if len(set(col)) != 9:
            break
    for i in range(0,9,3):
        square = []
        for j in range(0,9,3):
            square.append(puzzle[i][j])
            square.append(puzzle[i][j+1])
            square.append(puzzle[i][j+2])
            square.append(puzzle[i+1][j])
            square.append(puzzle[i + 1][j + 1])
            square.append(puzzle[i + 1][j + 2])
            square.append(puzzle[i+2][j])
            square.append(puzzle[i + 2][j + 1])
            square.append(puzzle[i + 2][j + 2])
            if len(set(square)) != 9:
                break
        if len(set(square)) != 9:
            break
    if row != 9 or len(set(col)) != 9 or len(set(square)) != 9:
        print("#{} {}".format(t + 1, 0))
    else:
        print("#{} {}".format(t + 1, 1))

- 더 멋진 코드

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

    result = 1
    # 가로 세로 검사
    for i in range(9):
        cnt_r = [0] * 10
        cnt_c = [0] * 10
        for j in range(9):
            cnt_r[arr[i][j]] += 1
            cnt_c[arr[j][i]] += 1

        # 중복 체크
        for k in range(1, 10):
            if cnt_r[k] != 1:
                result = 0
                break
            if cnt_c[k] != 1:
                result = 0
                break

    # 3x3 격자 검사
    for i in range(3):
        for j in range(3):
            cnt_x = [0] * 10
            for k in range(3):
                for l in range(3):
                    cnt_x[arr[3*i+k][3*j+l]] += 1

            for k in range(1, 10):
                if cnt_x[k] != 1:
                    result = 0
                    break

    print("#{} {}".format(tc, result))
profile
기죽지 않는 개발자

0개의 댓글