직사각형은 행 구간과 열 구간으로 정해요
앞에서 행·열 번호와 새 좌표를 다뤘어요. 이번에는 좌표를 바꾸지 않고 일부 범위를 선택해요. topbottom행과 leftright열이 한 직사각형을 정해요. 두 끝을 모두 포함하고 한 칸도 직사각형이에요.
같은 합이어도 위치나 크기가 다르면 다른 선택이에요. top≤bottom, left≤right로 정하면 빈 범위를 제외하면서 모든 직사각형을 셀 수 있어요.
선택한 범위마다 합을 새로 시작해요
격자 {{1,-1},{2,0}}에서 첫 행 전체는 합 0, 오른쪽 열 전체는 합 −1, 전체 격자는 합 2예요.
| 선택 범위 | 들어 있는 값 | 합 |
|---|---|---|
| 첫 행 전체 | 1, −1 | 0 |
| 오른쪽 아래 한 칸 | 0 | 0 |
| 전체 | 1, −1, 2, 0 | 2 |
합이 이미 target보다 크면 더 큰 범위도 모두 크다고 볼 수 있을까요? 음수 칸을 추가하면 합이 줄 수 있어요. 이번 제한은 작으므로 각 범위를 빠짐없이 열거하고 합을 계산할 수 있어요.
직접 풀어봐요
grid에서 적어도 한 칸을 포함하는 축에 평행한 직사각형을 골라요. 그 안 모든 값의 합이 target인 선택의 개수를 반환해요. 위치 또는 범위가 다르면 별도로 세요.
행·열 수는 각각 16, 원소는 −1010, target은 −360~360이에요. 모든 행의 길이는 같아요. 실행용 입력은 rows cols와 격자 값들, 마지막 줄 target이에요. 출력은 반환값이고 입출력은 하네스가 처리해요.
예시 1: grid={{1,2},{3,4}}, target=3 → 2. 값 3 한 칸과 첫 행 1+2 두 선택이에요.
예시 2: grid={{1,-1},{2,0}}, target=0 → 2. 첫 행 전체와 오른쪽 아래 0 한 칸 두 선택이에요.
예시 입력
2 2 1 2 3 4 3
예상 결과
2
예시 입력
2 2 1 -1 2 0 0
예상 결과
2
핵심 개념
array-2d: 행·열의 모든 닫힌 구간 조합을 세요.