ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SWEA / Python] 스도쿠 검증 | 초코더
    알고리즘/SW Expert Academy 2020. 8. 18. 01:49

    https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Psz16AYEDFAUq&categoryId=AV5Psz16AYEDFAUq&categoryType=CODE

     

    SW Expert Academy

    SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

    swexpertacademy.com

    문제

    스도쿠가 잘 이루어져있는지 검사하는 알고리즘을 짜야합니다.

    가로,세로,3x3에서 같은 숫자가 없으면 스도쿠가 잘 되어있는것.

     

    접근법

    1. 가로로 검사해주는 함수

    2. 세로로 검사해주는 함수

    3. 3x3을 검사해주는 함수

    를 각각 구현하여서

    모두 True가 나오면 1을 프린트

    그렇지 않으면 0을 프린트 해준다.

     

    느낀점

    가로와 세로는 늘 구현하던것처럼 해주어서 쉬웠는데 3x3을 어떻게 구현해야할지 꽤 고민했습니다.

    저는 복잡하지만,, 단순하게? 구현해보았습니다.

    3x3의 정사각형은 총9개 있습니다.

    우선 하나의 3x3은 아래와 같이 구현합니다.

    for i in range(3):
    	for j in range(3):
        		maps[i][j]

     

    그리고 각 시작점 (0,0),(3,0),(6,0) 에 대해 검사를 해주어야 하므로 아래와 같이 구현합니다.

                           (0,3),(3,3),(6,3)

                           (0,6),(3,6),(6,6)

    각각 x,y좌표가 3씩 증가해서 6까지만 증가하므로 2중포문을 만들어주었고 범위는 (0,7,3)으로 주었습니다.

    for x in range(0,7,3):
    	for y in range(0,7,3):
        		for i in range(3):
    			for j in range(3):
        				maps[i+x][j+y]

     

    전체코드

    import sys
    
    maps=[list(map(int,[p for p in sys.stdin.readline().split()])) for _ in range(9)]
    
    #가로
    def hori():
        ans=0
        for i in range(9):
            nums = list(range(1, 10))
            cnt = 0
            for j in range(9):
                if maps[i][j] in nums:
                    nums.remove(maps[i][j])
                    cnt+=1
                else:
                    return False
            if cnt==9:
                ans+=1
        if ans==9:
            #print('가로','True')
            return True
        return False
    
    #세로
    def verti():
        ans=0
        for i in range(9):
            nums = list(range(1, 10))
            cnt=0
            for j in range(9):
                if maps[j][i] in nums:
                    nums.remove(maps[j][i])
                    cnt+=1
                else:
                    return False
            if cnt==9:
                ans+=1
        if ans == 9:
            #print('세로', 'True')
            return True
        return False
    
    #3x3
    def bythree():
        ans=0
        for x in range(0,7,3):
            for y in range(0,7,3):
                nums = list(range(1, 10))
                cnt=0
                for i in range(3):
                    for j in range(3):
                        if maps[i+x][j+y] in nums:
                            nums.remove(maps[i+x][j+y])
                            cnt+=1
                if cnt==9:
                    ans+=1
        if ans==9:
            #print('3x3', 'True')
            return True
        return False
    
    if hori() and verti() and bythree():
        print(1)
    else:
        print(0)

    댓글

Designed by Tistory.