문제
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Psz16AYEDFAUq&
코드
def checkNumber(array):
set1, set2, set3, set4 = set(), set(), set(), set()
col=[set() for _ in range(9)]
cnt=0
for i in range(9):
cnt+=1
set4 = set()
for j in range(9):
col[j].add(array[i][j])
if array[i][j] in set4:
return 0
else:
set4.add(array[i][j])
if 0<=j<=2:
if array[i][j] in set1:
return 0
else:
set1.add(array[i][j])
elif 3<=j<=5:
if array[i][j] in set2:
return 0
else:
set2.add(array[i][j])
elif 6<=j<=8:
if array[i][j] in set3:
return 0
else:
set3.add(array[i][j])
#print(set1,set2,set3,set4)
if cnt==3:
set1,set2,set3=set(),set(),set()
cnt=0
for i in range(9):
if len(col[i])!=9:
return 0
return 1
t=int(input())
for i in range(t):
array=[]
for _ in range(9):
inputNumberList=list(map(int,input().split()))
array.append(inputNumberList)
result=checkNumber(array)
print("#%d" % (i+1),result)
풀이
이 문제 푸는데 테케가 자꾸 틀려서 왜지하고 계속 생각했는데 알고보니 행, 열, 3*3 전부 고려해야했던 문제였다. 문제를 제대로 잘 읽고 풀자…
- 행별로 루프 돌면서 숫자가 하나씩만 있는지 set 자료형을 이용해서 확인한다. 이는 2중 루프 중 내부 루프에서 확인한다. 내부루프가 끝나면 항상 set4를 초기화시켜준다.→set4
- set 자료형을 3개 만들어서 바깥 루프를 돌 때마다 cnt를 1씩 증가시키고, 내부루프를 돈 다음 cnt가 3이면 0으로 다시 초기화한다. 3*3 격자를 확인해야 하기 때문이다. 그리고 set1~3도 초기화시켜준다.
→set에 숫자를 넣기 전에 현재 숫자가 있는지 없는지 확인한다. 만약 있으면 바로 0을 리턴한다.
3. 열은 col이라는 리스트에 set자료형을 9만큼 만들어 준다음, 내부 루프 돌 때마다 현재 돌고 있는 원소를 열 별로 넣어준다. 그리고 마지막에 루프돌면서 길이가 9가 아닌 것이 발견되면 0을 리턴한다.
'알고리즘' 카테고리의 다른 글
[백준/파이썬(Python)] 나무자르기 2805 (0) | 2023.02.06 |
---|---|
[백준/파이썬(Python)] 2252 줄세우기(Gold 3) (2) | 2023.02.05 |
[프로그래머스/Python(파이썬)] 스킬트리 (0) | 2023.02.01 |
[백준 1495/파이썬(Python)] 기타리스트(실버 1) (0) | 2023.01.31 |
[Cos Pro 1급 기출문제/파이썬] 전광판 문구 출력 (0) | 2023.01.15 |
댓글