For Programmer
백준 14391번 파이썬 문제풀이(브루트 포스 - 종이 조각) 본문
728x90
코드
import itertools
# input
n, m = map(int, input().split())
x_lst = []
for _ in range(n):
x_lst.append(list(map(int, (input()))))
# matrix 1d -> 2d convert(비트마스크를 입력받은 행렬과 같은 모양으로 변형)
def bitmask_to_matrix(l, m):
return [l[i:i + m] for i in range(0, len(l), m)]
# itertools의 product를 이용해서 비트마스크 제너레이터 만들기
# e.g) (0,0,0,0), (0,0,0,1) ... (1,1,1,1) 0,1 을 reapeat개수만큼 반복해서 뽑아준다.
bitmask = itertools.product([0, 1], repeat=n * m)
ans = 0
# 가로부터 합계를 구해주고 세로 합계 구해줘서 더함
for x in bitmask:
# 비트마스크를 N*M 행렬로 변환
bitmask_matrix = bitmask_to_matrix(x, m)
# 가로합 저장
sum_width = 0
# 가로 계산
for i in range(n):
temp_width = 0
for j in range(m):
if bitmask_matrix[i][j] == 0:
temp_width = 10 * temp_width + x_lst[i][j]
if bitmask_matrix[i][j] == 1 or j == m - 1:
sum_width = sum_width + temp_width
temp_width = 0
# 세로합 저장
sum_height = 0
# 세로 계산
for j in range(m):
temp_height = 0
for i in range(n):
if bitmask_matrix[i][j] == 1:
temp_height = 10 * temp_height + x_lst[i][j]
if bitmask_matrix[i][j] == 0 or i == n - 1:
sum_height = sum_height + temp_height
temp_height = 0
#가로계산과 세로계산의 합 저장
sum_all = sum_width + sum_height
#최대값으로 계속 변경
ans = max(ans, sum_all)
print(ans)
-> 비트마스크를 이용해서 푸는 문제이다. 우선 비트마스크(0,1 로 이루어진 행렬)를 입력받은 행렬과 같은 형태로 만들어준다. 여기서 입력받은 행렬의 크기 만큼 0,1로 이루어질 수 있는 모든 경우의 수를 다 뽑아 내야한다.
그 후 뽑아놓은 비트마스크들을 반복문으로 돌며 0일 때는 가로값을 계산해 가로값에다 더해주고 1일때는 세로값만 계산하며 세로값들을 더해주어 그 두개의 값을 더하여 계속해서 최대값으로 저장하는 방식으로 문제를 풀어야 한다.
728x90
'코팅테스트 > 백준 문제 모음' 카테고리의 다른 글
백준 11726번 파이썬 문제풀이(DP - 2*n 타일링) (0) | 2021.10.28 |
---|---|
백준 1463번 파이썬 문제풀이(DP - 1로 만들기) (0) | 2021.10.28 |
백준 1182번 파이썬 문제풀이(브루트 포스 - 부분수열의 합) (0) | 2021.10.26 |
백준 6603번 파이썬 문제풀이(브루트 포스 - 로또) (0) | 2021.10.26 |
백준 10971번 파이썬 문제풀이(브루트 포스 - 외판원 순회 2) (1) | 2021.10.25 |
Comments