https://www.acmicpc.net/problem/9291
새벽에 졸린 거 참아가며 풀었는데,, ㅋ
알고보니 입력값 중간에 엔터 처리 때문에 오늘까지 끌고왔다.
2차원 리스트에서 열만 추출하기
행은 어차피 앞쪽 인덱스만 처리해주면 행값만 추출하니까 어렵지 않게 추출할 수 있다.
근데 열은..?! [ ][i] 이런 처리가 안되니까, 따로 빼주어야 한다.
이때 이중 for문의 구조를 활용하면 되는데,
안쪽 for문 인덱스가 먼저 증가하니까 먼저 증가하는 인덱스를 열번호로 지정해주면 열만 추출해서 배열에 저장할 수 있다.
col = []
for x in range(n) :
sub = []
for y in range(n):
sub.append(arr[y][x])
# 이렇게 하면 안쪽 for문이 끝날 때 열 한 줄 추출 완료
# 추출된 열 데이터를 새로운 배열 col에 저장.
col.append(sub)
# 이후 col에 1~9가 모두 있는지 비교
for i in range(9) :
if sorted(col[i]) != num : flag = True; break
좀 아쉬운 생각이 든 건 꼭 저장을 하면서 비교해야하나?? 였다.
그래서 이후 이중 for문 안에서 sub를 바로 처리하는 코드를 구현했다.(어차피 1~9까지 있/없 문제니까)
이렇게 수정을 하면
1. 이중 for문 전체를 돌지 않아도됨.
2. col 배열을 다시 비교하는 for문을 없애도됨.
이유로, 코드 길이, 시간이 확 줄어든다..!오예
# 열 검사 열 추출.. i부터 증가시킴
for j in range(9) :
t = []
for i in range(9) :
t.append(board[i][j])
if sorted(t) != num : flag = True; break
전체 n*n 이차원 리스트에서 m*m 부분 리스트 추출하기
이 부분이 젤 힘들었다. 일단 4중 for문을 짜볼 일이 많이 없었다(당당)
챗gpt한테 물어봤는데 얘가 4중 for문으로 짜주는거다.
그래서 두현이한테
"얘 코드는 짤 줄 아는데 비효율적이네 ㅋㅋ 4중 포문 쓰란다 ㅋㅋ" 했는데
돌아오는 답변이 "4중 포문 맞음."
결론 : 추세빈 < 챗gpt < 김두현(알고리즘킹갓)
sorry gpt,,,,,,,
땅땅땅...
res = []
for i in range(0, 9, 3) :
for j in range(0, 9, 3) :
sub = []
for k in range(i, i+3) :
for l in range(j, j+3) :
sub.append(board[k][l])
if sorted(sub) != num : flag = True; break
일단 3칸씩 행, 열을 이동할 수 있도록 바깥 for문에서 0,9,3 처리를 해준다.
그 뒤 해당 인덱스를 범위로 가지는 이중 for문으로 3개까지 이동할 수 있도록 처리해준다.
이것도 마찬가지로 굳이 저장을 하지 않고 구현하는 방법을 알고싶은데..
일단 m*m 부분 행렬 추출하는 거를 많이 다뤄보면서 익숙해지는게 우선인듯
for i in range(3):
for j in range(3):
a = []
for k in range(3):
for l in range(3):
a.append(A[3*k+k][3*l+l])
이렇게 k,l 인덱스에 값을 계산해줌으로써 구현할 수도 있다!!
전체 코드
n = int(input())
num = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for n_i in range(n) :
flag = False
if 1 <= n_i <= n : empty = input()
board = [list(map(int, input().split())) for _ in range(9)]
# 행 검사
for i in range(9) :
if sorted(board[i]) != num : flag = True; break
# 열 검사 열 추출.. i부터 증가시킴
for j in range(9) :
t = []
for i in range(9) :
t.append(board[i][j])
if sorted(t) != num : flag = True; break
'''for i in range(9) :
if sorted(col[i]) != num : flag = True; break'''
# 3*3 행, 열 검사
res = []
for i in range(0, 9, 3) :
for j in range(0, 9, 3) :
sub = []
for k in range(i, i+3) :
for l in range(j, j+3) :
sub.append(board[k][l])
if sorted(sub) != num : flag = True; break
if flag :
print('Case {}: INCORRECT'.format(n_i+1))
else:
print('Case {}: CORRECT'.format(n_i+1))
알게된 점
- 파이썬 행만 추출 / 열만 추출 / n*n 부분 행렬 추출
- 입력값 중간에 엔터 처리하기
- for 문 여러개 쓸 때 in 앞에 변수를 모두 i로 처리해버리기 좀 그렇다 생각했는데 별 상관없음ㅋ
'PS > BOJ&Programmers' 카테고리의 다른 글
[백준/3184] 양 | 그래프 영역 구별 하기 (2) | 2023.02.28 |
---|---|
[백준/10026] 적록색약 | 그래프 영역 구별, 같은 조건일 때 처리 (0) | 2023.02.27 |
[PS/MySQL] 프로그래머스 SQL 고득점 Kit Lv1 문제(3) ^_^ (1) | 2023.02.24 |
[백준/6186] Best Grass | bfs, dfs (0) | 2023.02.22 |
[백준/6550] 부분 문자열 | 반복문으로 고정된 인덱스 다루기 (0) | 2023.02.21 |