[파이썬] 백준 1034번 램프

작성:

백준 #1034 램프


# 출력: 켜진 행의 최댓값

# 체크할 조건
# 1 <= N, M <= 50
# 0 <= K <= 1000

# 켜지는 행이 있다면 적어도 하나의 행은 켜진다.
    # 그때의 열의 on/off 배열은 고유하다.
    # 같이 켜지는 행은 이후에 체크할 필요 없다.
    # 켜지는 행을 만들고 K가 짝수 만큼 남으면 카운트 가능.
# 켜진 행 개수의 최댓값을 갱신하며 모든 행을 순회.

import sys
input = sys.stdin.readline

def solution(N, M):
    lst = [input().strip() for i in range(N)]
    K = int(input())
    result = 0
    lamps = []
    for column in zip(*lst):
        lamps.append('0b1' + ''.join(column))
    visited_row = [0] * N
    std = (1 << N) - 1
    for i in range(N):
        if visited_row[i]: continue
        cols = lamps[:]
        left = K
        is_possible = True
        for j in range(M):
            if cols[j][i+3] == '0':
                if not left: 
                    is_possible = False
                    break
                left -= 1
                cols[j] = bin(int(cols[j], base=2) ^ std)
        if left&1: is_possible = False
        if not is_possible: continue
        cnt = 1
        visited_row[i] = 1
        for k in range(i+1, N):
            for j in range(M):
                if cols[j][k+3] == '0':
                    break
            else:
                cnt += 1
                visited_row[k] = 1
        result = max(result, cnt)
    print(result)

if __name__ == '__main__':
    solution(*map(int, input().split()))

댓글남기기