[Softeer] 9657/Lv.2/나무 공격/Python/파이썬/구현

·2025년 2월 6일
0

문제풀이

목록 보기
31/56
post-thumbnail

⌛️ 언어별 시간/메모리

💡문제

저작권 이슈로 인하여 페이지 참조

제약조건

[조건 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

📖내가 작성한 Code

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()

✍️풀이과정

단순한 구현 문제. 그냥 허슬하게 읽으면서 차력쇼 하면 됨.


🧠 코드 리뷰

  1. 코드가 문제 설명의 “격자, 투사체 이동 시뮬레이션”을 직관적으로 반영하지는 못해 가독성이 떨어집니다.

🛠️AI 개선 코드

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()

💻결과

소프티어문제 보러가기


🖱️참고 링크

코드 설명 붙이기

profile
우물 안에서 무언가 만드는 사람

0개의 댓글