코딩테스트/SW Expert Academy / / 2024. 9. 29. 17:32

[D2] 1974. 스도쿠 검증

1974. 스도쿠 검증

 

✏️ 문제 풀이

- seen 리스트 생성 → 0~9까지의 인덱스를 가지며 초기값은 모두 False로 초기

- seen 리스트에서 현재 숫자(value)의 인덱스 확인 → 값이 True라면, 이전에 같은 숫자가 이미 발견되었음을 의미하므로 0 반환

- 모든 열을 체크한 후에도 중복된 숫자가 발견되지 않으면 1 반환 

- 3 x 3 검증은 0부터 8까지의 숫자를 3씩 증가시키며 반복해서 검증

def is_row_valid(sudoku):
    # 가로줄 검증 함수
    for row in range(9):
        seen = [False] * 10  # 1~9 숫자별 방문 여부 확인. 0번째 인덱스는 사용하지 않음.
        for col in range(9):
            value = sudoku[row][col]            
            if seen[value]:  # 이미 방문한 숫자일 경우
                return 0
            else:
                seen[value] = True  # 숫자 방문 표시
    return 1

def is_col_valid(sudoku):
    # 세로줄 검증 함수
    for col in range(9):
        seen = [False] * 10  # 1~9 숫자별 방문 여부 확인.
        for row in range(9):
            value = sudoku[row][col]
            if seen[value]:  # 이미 방문한 숫자일 경우
                return 0
            else:
                seen[value] = True  # 숫자 방문 표시
    return 1

def is_square_valid(sudoku):
    # 3x3 사각형 검증 함수
    for row_start in range(0, 9, 3):
        for col_start in range(0, 9, 3):
            seen = [False] * 10  # 1~9 숫자별 방문 여부 확인.
            for i in range(3):
                for j in range(3):
                    value = sudoku[row_start + i][col_start + j]
                    if seen[value]:  # 이미 방문한 숫자일 경우
                        return 0
                    else:
                        seen[value] = True  # 숫자 방문 표시
    return 1
            
T = int(input())  
for tc in range(1, T + 1):
    sudoku = [list(map(int, input().split())) for _ in range(9)]  # 9x9 스도쿠 입력
    
    row_checked = is_row_valid(sudoku)
    col_checked = is_col_valid(sudoku)
    square_checked = is_square_valid(sudoku)   

    if (row_checked == 0 or col_checked == 0 or square_checked == 0):
        answer = 0 
    else:
        answer = 1  
    
    print(f"#{tc} {answer}")
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유