-
14391 종이조각알고리즘/백준 2019. 3. 6. 04:04
1. 문제
2. 코드
1234567891011121314151617181920212223242526272829303132333435363738394041def check():global maxval#비트마스크로 2^(N*M)의 경우의 수를 다 따져본다.for state in range(1<<N*M):total = 0#가로 숫자의 합for row in range(N):rowsum = 0for col in range(M):idx = row*M + col#가로일 때(1)if state & (1<<idx) != 0:rowsum = rowsum*10 + paper[row][col]else:total += rowsumrowsum = 0#모든 칸을 다 검사하고 마지막 더한 값도 추가해준다.total += rowsum#세로 숫자의 합for col in range(M):colsum = 0for row in range(N):idx = row*M + col#세로일 때(0)if state & (1<<idx) == 0:colsum = colsum * 10 + paper[row][col]else:total += colsumcolsum = 0total += colsummaxval = max(maxval,total)N, M = map(int,input().split())paper = [[int(i) for i in input()]for _ in range(N)]maxval = 0check()print(maxval)cs 3. 후기이 문제의 핵심은 모든 칸마다 가로인지 세로인지 0과 1을 이용해서 나타낸다는 것이다.한 칸마다 가로와 세로 두 가지 경우의 수가 있으므로 모든 칸의 경우의 수는 총 2^(N*M)이다.0과 1을 비트마스크로 표현하였다. 그래서 만약 3X3 행렬이 있으면 000000000 부터 111111111까지 검사해서 최대값을 뽑아낸다.다른 블로그에서는 이해하기 쉽도록 재귀로 풀었는데 비트마스크를 공부해 볼겸 첫번째 블로그를 참조하였다.'알고리즘 > 백준' 카테고리의 다른 글
2003 수들의 합 2 - 투포인터 (0) 2019.03.08 12100번 2048(easy) - DFS (0) 2019.03.08 13460 구슬 탈출 2 -BFS (0) 2019.03.07 1062 가르침 (1) 2019.03.06 2580 스도쿠 (0) 2019.03.06