일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 웹
- codeup
- 공개키
- RSA
- 프로그래머스
- 기계학습
- ImageBase
- StoredXSS
- XSS
- 암호학
- 보안
- dsa
- Database
- 파일구조
- RVA
- 디피헬먼
- 코드업
- 심층학습
- injection
- Cross Site Scripting
- SQL_Injection
- 딥러닝
- SQL
- db
- 알고리즘
- 인공지능
- ReflectedXSS
- dvwa
- 머신러닝
- C언어
- Today
- Total
Ye0ngJae
[BOJ] 2563번 "색종이" 파이썬 풀이 본문
문제
로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.
예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.
입력
첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다
출력
첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.
입력 예시
3
3 7
15 7
5 2
출력 예시
260
답안
코드
import sys
num = int(sys.stdin.readline().strip())
board = [[0 for _ in range(100)] for _ in range(100)]
for i in range(num):
N, M = map(int, sys.stdin.readline().strip().split())
for j in range(M, M+10):
for k in range(N, N+10):
board[j][k] = 1
result = 0
for i in range(100):
result += board[i].count(1)
print(result)
풀이
주어진 조건에 따라 색종이가 붙은 영역의 넓이를 구하는 문제입니다. 주어진 입력으로부터 색종이의 위치를 받고, 해당 위치에 색종이가 붙었다고 가정하여 2차원 배열(도화지)에 표시합니다. 색종이의 크기는 10x10이므로, 각 색종이가 붙는 위치에서부터 가로와 세로로 10칸씩 해당 영역을 1로 표시하여 검은색 영역을 나타냅니다. 이때, 색종이의 넓이를 1과 0으로 표현하기 때문에 만일 색종이가 겹치더라도 넓이를 추가로 계산하는 일은 없습니다. 모든 색종이를 2차원 배열에 표시한 후에 1로 표시된 칸의 수를 세어 검은색 영역의 넓이를 계산합니다.
- 입력 받기: 첫 번째 줄에서 색종이의 수를 입력받고, 이후 각 색종이의 위치를 입력받습니다.
도화지 초기화: 100x100 크기의 2차원 배열을 생성하고, 모든 값을 0으로 초기화합니다. 여기서 0은 흰색 영역을, 1은 검은색 영역을 나타냅니다. - 색종이 붙이기: 각 색종이의 위치에 따라 해당 영역을 1로 변경합니다. 색종이의 위치(N, M)를 기준으로 가로와 세로로 10칸씩 1로 값을 변경합니다.
- 넓이 계산: 2차원 배열 전체를 순회하며 1의 값을 가진 칸의 수를 세어 넓이를 계산합니다.
결과 출력: 계산된 넓이를 출력합니다.
코드 설명:
- num = int(sys.stdin.readline().strip()): 색종이의 수를 입력받습니다.
- board = [[0 for _ in range(100)] for _ in range(100)]: 100x100 크기의 2차원 배열을 생성하고, 0으로 초기화합니다.
- for i in range(num): 입력받은 색종이의 수만큼 반복합니다.
- N, M = map(int, sys.stdin.readline().strip().split()): 색종이의 왼쪽 변과 아래쪽 변 사이의 거리를 입력받습니다.
- for j in range(M, M+10)와 for k in range(N, N+10): 색종이의 위치에서 가로와 세로로 10칸씩 해당 영역을 1로 변경합니다.
- result += board[i].count(1): 2차원 배열 전체를 순회하며 1의 값을 가진 칸의 수를 세어 result에 더합니다.
- print(result): 최종 계산된 검은색 영역의 넓이를 출력합니다.
'알고리즘 > 파이썬' 카테고리의 다른 글
[BOJ] 18870번 "좌표 압축" 파이썬 풀이 (1) | 2024.03.28 |
---|---|
[BOJ] 2720번 "세탁소 사장 동혁" 파이썬 풀이 (0) | 2024.03.28 |