fromzero
쪼렙 성장기
fromzero
전체 방문자
오늘
어제
  • Home
    • TIL
      • Python
      • HTML&CSS
      • Django
      • React
      • React Native
      • Git & Jira
      • Tech News
    • Algorithm
      • SW Expert Amademy
      • Baekjoon Online Judge
    • SSAFY
    • Daily log

인기 글

최근 댓글

최근 글

글쓰기 | 설정
hELLO · Designed By 정상우.
fromzero

쪼렙 성장기

SWEA 1974. 스도쿠 검증 (파이썬)
Algorithm/SW Expert Amademy

SWEA 1974. 스도쿠 검증 (파이썬)

2022. 2. 27. 18:11
문제

 

제약 사항
1. 퍼즐은 모두 숫자로 채워진 상태로 주어진다.
2. 입력으로 주어지는 퍼즐의 모든 숫자는 1 이상 9 이하의 정수이다.

입력
입력은 첫 줄에 총 테스트 케이스의 개수 T가 온다.
다음 줄부터 각 테스트 케이스가 주어진다.
테스트 케이스는 9 x 9 크기의 퍼즐의 데이터이다.

출력
테스트 케이스 t에 대한 결과는 “#t”을 찍고, 한 칸 띄고, 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

문제에 대한 모든 권리는 SW Expert Academy에게 있습니다

 

 

 아이디어 

랄 건 없다...
그냥 가로, 세로, 3*3 각각 확인해주면 된다. ㅎㅎ

대신 세로를 확인할 때에는 굳이 어렵게 행을 바꿔가며 세지 않고, 가로와 세로를 뒤바꾼 전치행렬을 만들어서 처리했다.

 

 

 코드 

# 9*9 스도쿠를 확인하는 함수
def sudoku_check(arr):
    for i in range(9): # 행고정
        check = [0] * 9 # 카운팅 정렬을 위한 빈 리스트
        for j in range(9):
            for idx in range(1, 10):
                if idx == arr[i][j]:
                    check[idx-1] += 1
        # 카운팅 정렬한 리스트 내에 1보다 큰 값이 있다?
        # => 하나가 두 번 나온 것
        if max(check) > 1:
            return False
    return True

# 3*3 스도쿠를 확인하는 함수
def tt_check(arr):
    # (0,0), (0,3), (0,6), ..., (6,6)이 시작점
    for i in [0, 3, 6]:
        for j in [0, 3, 6]:
            check = [0] * 9
            # 가로세로 3
            for k in range(3):
                for l in range(3):
                    # 카운팅 정렬
                    for idx in range(1, 10):
                        if idx == arr[i + k][j + l]:
                            check[idx-1] += 1
            if max(check) > 1:
                return False
    return True

T = int(input())
for tc in range(1, 11):
    puzzle = [list(map(int, input().split())) for _ in range(9)]
    # print(puzzle)

    # 가로로 탐색
    row_check = sudoku_check(puzzle)

    # 세로로 탐색 => 전치 행렬 사용
    col_puzzle = list(map(list, zip(*puzzle)))
    col_check = sudoku_check(col_puzzle)

    # 3*3 탐색
    tbyt_check = tt_check(puzzle)

    # 최종 출력
    print(f'#{tc} {row_check * col_check * tbyt_check}')

 

 

 리뷰 

더 잘 짤 수도 있겠지만... 22년 2월 27일의 나에게는 이게 최선

다음에 더 좋은 코드 짜면 추가하겠음

저작자표시 (새창열림)

'Algorithm > SW Expert Amademy' 카테고리의 다른 글

SWEA 1208. Flatten (파이썬)  (0) 2022.02.27
4835. 파이썬 S/W 문제해결(알고리즘) | 구간합  (0) 2022.02.14
6209, 6216. 파이썬 연산자 연습 문제  (0) 2022.01.25
6206. 파이썬 연산자 연습 문제  (0) 2022.01.25
6314. 파이썬 내장함수 연습문제 2  (0) 2022.01.16
    'Algorithm/SW Expert Amademy' 카테고리의 다른 글
    • SWEA 1208. Flatten (파이썬)
    • 4835. 파이썬 S/W 문제해결(알고리즘) | 구간합
    • 6209, 6216. 파이썬 연산자 연습 문제
    • 6206. 파이썬 연산자 연습 문제
    fromzero
    fromzero

    티스토리툴바