[조건 1] 5 ≤ n, m ≤ 100
[조건 2] 1 ≤ L1, L2, R1, R2 ≤ n
첫 번째 줄에는 격자의 크기를 나타내는 n과 m이 공백을 사이에 두고 주어집니다.
두 번째 줄부터는 n개의 줄에 걸쳐 각 행에 해당하는 m개의 격자 정보가 공백을 사이에 두고 주어집니다. 격자 내 숫자는 0, 1로만 주어지며 0은 비어있는 칸을, 1은 환경 파괴범이 있는 칸임을 뜻합니다.
n+2번째 줄에는 첫 번째 공격 정보에 해당하는 L1,R1값이 공백을 사이에 두고 주어집니다. 이는 L1번째 행부터 R1번째 행까지 공격이 이루어짐을 뜻하며, R1−L1은 항상 4임을 가정해도 좋습니다.
n+3번째 줄에는 두 번째 공격 정보에 해당하는 L2,R2값이 공백을 사이에 두고 주어집니다. 이는 L2번째 행부터 R2번째 행까지 공격이 이루어짐을 뜻하며, R2−L2는 항상 4임을 가정해도 좋습니다.
첫 번째 줄에 두 번의 공격 이후 격자에 남아있는 서로 다른 환경 파괴범의 수를 출력합니다.
6 8
0 0 1 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 1 0 0 1 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
1 5
2 6
2
import sys
'''
2번의 공격
'''
def main():
inputs = map(str.split, sys.stdin.read().splitlines())
N = int(next(inputs)[0])
human_list = [sum([int(i) for i in next(inputs)]) for _ in range(N)]
for _ in range(2):
start, end = next(inputs)
for i in range(int(start)-1, int(end)):
human_list[i] = max(human_list[i] - 1, 0)
sys.stdout.write(str(sum(human_list)))
if __name__ == '__main__':
main()
단순한 구현 문제. 그냥 허슬하게 읽으면서 차력쇼 하면 됨.
import sys
def main():
"""
격자(n×m) 정보와 두 번의 공격(L1~R1, L2~R2)이 주어졌을 때
공격 이후 남아있는 환경 파괴범(=1)의 총 수를 계산하는 프로그램.
- 한 행에 있는 파괴범의 개수(1의 개수)를 row_counts에 저장
- 공격 범위에 포함된 행마다 최대 1명씩 제거
- 최종적으로 남은 파괴범의 총 수를 출력
"""
input_lines = sys.stdin.read().splitlines()
# (1) n, m 읽기
n, m = map(int, input_lines[0].split())
# (2) n개의 행 정보를 받아, 각 행에 있는 파괴범 수(1) 합산
row_counts = []
for i in range(1, n+1):
row_data = list(map(int, input_lines[i].split()))
# m개의 0/1이 주어지므로, 합을 구해 해당 행의 파괴범 수로 저장
row_counts.append(sum(row_data))
# (3) 두 번의 공격 정보 읽기
# L1,R1 / L2,R2 형태
L1, R1 = map(int, input_lines[n+1].split())
L2, R2 = map(int, input_lines[n+2].split())
# (4) 첫 번째 공격
# L1행부터 R1행까지(파이썬은 0-based이므로 L1-1 ~ R1-1)
for row in range(L1 - 1, R1):
# 각 행에서 최대 1명 제거
row_counts[row] = max(row_counts[row] - 1, 0)
# (5) 두 번째 공격
for row in range(L2 - 1, R2):
row_counts[row] = max(row_counts[row] - 1, 0)
# (6) 남은 파괴범의 총 수 출력
print(sum(row_counts))
if __name__ == '__main__':
main()