https://www.acmicpc.net/problem/20543
20543번: 폭탄 던지는 태영이
시험을 망친 태영이가 인하대학교에 폭탄을 던진다! 인하대학교는 N×N 크기의 정사각형 모양의 땅이다. 인하대학교의 모든 땅은 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)
www.acmicpc.net
백준 - 폭탄 던지는 태영이 (20543번)
난이도 : Gold 1
알고리즘&자료구조 : Prefix Sum (누적 합)
시간복잡도 (Time Complexity) : O( N^2 )
★ 핵심 Idea ★
◎ 누적합으로 생각보다 간단하게 구현할 수 있는 문제이다.
N = 5, M = 3일 때,
(0, 0) 좌표에 영향을 미칠 수 있는 폭탄의 위치는 (1, 1) 뿐이다.
따라서 (0, 0) 좌표 값을 통해 (1, 1) 위치의 폭탄 값을 구하고,
이전에 구한 폭탄 값들을 바탕으로 누적합을 통해서
다른 폭탄 값들을 구할 수 있다.
< 예제 입력 2 >
N = 5
M = 3






< 전체 코드 >
import sys
input = sys.stdin.readline
class Inha():
def __init__(self, N, M):
board = [[0] * N for _ in range(M-1)] + [list(map(lambda x: -int(x), input().split())) for _ in range(N-M+1)]
for c in range(N):
acc = 0
for r in range(M-1, N):
board[r][c] -= acc
acc += board[r][c] - board[r-M+1][c]
board = board[M-1:]
board = [[0]*(M-1) + row[:(N-M+1)] for row in board]
for r in range(N-M+1):
acc = 0
for c in range(M-1, N):
board[r][c] -= acc
acc += board[r][c] - board[r][c-M+1]
board = [row[M-1:] for row in board]
board = [[0]*N for _ in range(M>>1)] + [[0]*(M>>1) + row + [0]*(M>>1) for row in board] + [[0]*N for _ in range(M>>1)]
self.board = board
if __name__ == '__main__':
uni = Inha(*map(int, input().split()))
print('\n'.join(' '.join(map(str, row)) for row in uni.board))
'Algorithm' 카테고리의 다른 글
주식 (12014번) - 백준 (BOJ) (0) | 2023.09.22 |
---|---|
새로운 게임 (17780번) - 백준 (BOJ) (0) | 2023.09.15 |
인터넷 설치 (1800번) - 백준 (BOJ) (0) | 2023.09.12 |
소용돌이 예쁘게 출력하기 (1022번) - 백준 (BOJ) (0) | 2023.09.11 |
용이 산다 (3430번) - 백준 (BOJ) (0) | 2023.09.10 |