흰 스타렉스에서 내가 내리지

[BOJ] (BIT, BF)14391번 종이 조각 ★★ 본문

Problem Solving

[BOJ] (BIT, BF)14391번 종이 조각 ★★

주씨. 2022. 2. 6. 14:19
728x90

 

 

일단 배열을 어떻게 저렇게 가로 세로로 칸을 나누는지 감을 못잡았다

2차원 배열을 1차원 배열로 풀어서, 각 요소마다 인덱스를 부여.

가로방향을 1, 세로방향을 0이라고 생각하면, 총 경우의 수는 2의n*m제곱.

1과0으로 표현할 거니까 비트마스킹을 이용하여 저장.

 

인덱스 k = i*m + j이고, 이 k번째 요소가 0인지 1인지 확인하려면 b&(1<<k) == 0 이용

now = now*10 + arr[i][j] 을 이용해서 수 합치기

 

n, m = map(int, input().split())
arr = []
for _ in range(n):
    arr.append(list(map(int, list(input()))))

ans = 0
for b in range(1<<m*n):
    _sum = 0
    # 가로 0  세로 1
    
    #가로방향
    for i in range(n):
        now = 0
        for j in range(m):
            k = i*m + j
            
            if b&(1<<k) == 0:
                now = now*10 + arr[i][j]
            else:
                _sum += now
                now = 0
                
        _sum += now
    
    # 세로 방향
    for j in range(m):
        now = 0
        for i in range(n):
            k = i*m + j
            
            if b&(1<<k) != 0:
                now = now*10 + arr[i][j]
            else:
                _sum += now
                now = 0
            
        _sum += now
        
    ans = max(ans, _sum)
    
    
print(ans)

 

 

https://www.acmicpc.net/problem/14391

 

14391번: 종이 조각

영선이는 숫자가 쓰여 있는 직사각형 종이를 가지고 있다. 종이는 1×1 크기의 정사각형 칸으로 나누어져 있고, 숫자는 각 칸에 하나씩 쓰여 있다. 행은 위에서부터 아래까지 번호가 매겨져 있고,

www.acmicpc.net