문제 출처 : SW Expert Academy
1. 색칠하기
1) 색칠영역은 0으로 구성된 2차원 배열로 표시 (10 x 10)
2) 가로(x)축과 세로(y)축을 이동하며 for문이 진행되며 만나는 좌표마다 +1
T = int(input())
for tc in range(1, T+1):
n = int(input())
arr=[[0]*10 for _ in range(10)]
cnt = 0
for _ in range(n):
x1, y1, x2, y2, color = map(int, input().split())
for i in range(x1, x2+1):
for j in range(y1, y2+1):
if arr[i][j] == 1:
cnt += 1
elif arr[i][j] == 0:
arr[i][j] += 1
print(f'#{tc} {cnt}')
2. 부분집합의 합
- n개 원소집합 -> 비트연산자 << 로 구함
- 부분집합의 모든 경우의 수는 2의 n승
T = int(input())
for tc in range(1, T+1):
n, k = map(int, input().split())
nums = list(range(1,13))
cnt = 0
for case in range(1 << 12):
sub_sum = []
sum_value = 0
for i in range(12):
if case & (1 << i):
sub_sum.append(nums[i])
sum_value += nums[i]
if len(sub_sum) == n and sum_value == k:
cnt += 1
print(f'#{tc} {cnt}')
if case & (1 << i) 의미
비트 연산자는 2진수로 변환해서 비교한다
case 가 3인 경우는 이진수로 011 이고,
(1 << i)에서 i가 1인 경우 001, 2인 경우 010, 3인 경우 100 이다.
011 & 001 = 001 (True) --> 1이 부분집합으로 들어간다.
011 & 010 = 010 (True) --> 2가 부분집합으로 들어간다.
011 & 100 = 000 (False)
즉, case가 3인 경우 sub_sum =[1,2] sum_value=3이 된다.