For Programmer

SWEA 1979 파이썬 문제풀이(어디에 단어가 들어갈 수 있을까) 본문

코팅테스트/백준 문제 모음

SWEA 1979 파이썬 문제풀이(어디에 단어가 들어갈 수 있을까)

유지광이 2022. 2. 9. 23:42
728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PuPq6AaQDFAUq 

 

SW Expert Academy

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

swexpertacademy.com

 


이 문제 난이도가 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
Comments