For Programmer
SWEA 1979 파이썬 문제풀이(어디에 단어가 들어갈 수 있을까) 본문
728x90
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PuPq6AaQDFAUq
이 문제 난이도가 d2라고 하는데 생각보다 생각하기 어렵다... d2맞나?.... 우선, 계속 생각하다가 도대체 어떻게 가로랑 세로를 한 반복문안에서 함께검사하지? 하다가 그냥 따로 검사했더니 맞았다.
우선 가로와 세로를 따로 검사하기 위해 입력받은 리스트를 임시 리스트 2개에 각각 복사 한다. 그 후 전체 인덱스를 돌면서 한 인덱스에서 가로로만(열방향) 쭉쭉 이동해면서 검은색 블럭을 만나면 멈춰준다. 렇게 이동하면서 흰색 블럭의 개수를 센 후 검사한 흰색블럭을 검은색 블럭으로 바꿔준다. 이런식으로 중복검사 하는 것을 피해준다. 또한 센 흰색블럭의 개수가 K랑 동일하면 결과변수에 +1 하는 식으로 풀어냈다. 세로도 동일한 방식으로 접근하였다.
import sys
sys.stdin = open('input.txt', 'r')
T = int(input())
for order in range(1, T + 1):
N, K = map(int, input().split())
array = [list(map(int, input().split())) for _ in range(N)]
array_r, array_c = [], [] # 가로와 세로 개수를 따로 구하기 위해 리스트 2개를 선언
for i in range(N): # 값들을 그대로 새로운 리스트에 복사해준다.
temp1 = []
temp2 = []
for j in range(N):
temp1.append(array[i][j])
temp2.append(array[i][j])
array_r.append(temp1)
array_c.append(temp2)
result = 0 # 총 결과를 출력할 변수
# 세로 계산
for i in range(N):
for j in range(N):
count = 0 # 흰색블럭 개수를 셀 변수
for h in range(i, N): # 어떠한 인덱스에서 밑으로 쭉 검사한다.(세로 한줄을 검사)
if array_c[h][j] == 0: # 만약 해당 인덱스의 값이 검은색 블럭이면
break # 바로 다음 열 검사를 위해 이동
count += 1 # 만약 흰색 블럭이라면 개수 +1
array_c[h][j] = 0 # 그 후 조사한 블럭을 0으로 처리
if count == K: # 만약 다돌고 난 후 그 개수가 k개 라면
result += 1 # 결과에 +1
# 가로 계산
for i in range(N):
for j in range(N):
count = 0 # 흰색블럭 개수를 셀 변수
for h in range(j, N): # 어떠한 인덱스에서 옆으로 쭉 검사한다.(가로 한줄을 검사)
if array_r[i][h] == 0: # 만약 해당 인덱스의 값이 검은색 블럭이면
break # 탈출 후 다음 열로 이동
count += 1 # 만약 흰색 블럭이라면 개수 +1
array_r[i][h] = 0 # 그후 조사한 블럭을 검은색 블럭으로 처리
if count == K: # 다 돌고 난후 흰색 블럭 개수가 K개 라면
result += 1 # 결과에 +1
print(f'#{order} {result}')
728x90
'코팅테스트 > 백준 문제 모음' 카테고리의 다른 글
SWEA 6190 파이썬 문제풀이(정곤이의 단조 증가하는 수) (0) | 2022.02.10 |
---|---|
SWEA 2805 파이썬 문제풀이(농작물 수확하기 ) (0) | 2022.02.10 |
SWEA 4466 파이썬 문제풀이(최대 성적표 만들기) (0) | 2022.02.08 |
SWEA 1961 파이썬 문제풀이(숫자 배열 회전) (0) | 2022.02.08 |
SWEA 1947 파이썬 문제풀이(스도쿠 검증) (0) | 2022.02.08 |
Comments