[백준 2563] 색종이
1. 문제
2563번: 색종이
가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록
www.acmicpc.net
⭐문제요약 ⭐
x와 y좌표 상에 색이 칠해진 부분의 넓이를 계산하라.
2. 아이디어 (문제 속 문제)
입력값이 주어지면 모든 사각형의 좌표값을 알 수 있다.
위 문제처럼 2차원으로 먼저 생각하려니 접근하기가 어려웠다.
그래서 1차원 문제로 생각하고 연습 문제를 만들어봤다.
1) 조건
- 색종이가 놓일 선분 길이(N)은 100이다.
- 색종이의 길이는 100이하의 자연수다. 색종이가 놓인 위치 좌표 또한 자연수다.
- 색종이를 무작위로 선분위에 놓는다. 최종적으로 색종이가 차지하는 선분의 길이는 몇인지 구해보자.
- 색종이의 길이는 10이다.
2) 입력
- 첫째 줄에는 색종이의 수를 입력한다.
- 둘째 줄부터 한 줄씩 색종이의 첫 위치좌표를 찍어준다.
3) 출력
- 색종가 차지하는 선분의 길이를 출력하라.
예시
입력 | 출력 |
3 10 15 20 |
20 |
"""선분 수학"""
# 색종이의 수 입력
N = int(input())
# 색종이의 시작 위치 입력
positions = list(map(int, input().split()))
# 색종이가 덮는 위치를 저장할 set 초기화
covered_positions = set()
# 각 색종이에 대해
for pos in positions:
# 현재 색종이가 덮는 위치를 set에 추가
for i in range(pos, pos + 10):
covered_positions.add(i)
# 색종이가 차지하는 총 길이 출력
print(len(covered_positions))
✔️포인트
set()을 사용하여 중복을 제거한다.
색종이의 시작점~끝점을 범위로 인덱스 번호를 covered_position 리스트에 add해준다.
covered_position의 배열길이를 출력하면 끝.
3. 풀이
1차원 문제를 풀었으니 2차원도 같은 개념으로 풀면 된다.
"""색종이 수학"""
N = int(input())
points = set()
for _ in range(N):
x, y = map(int,input().split()) #왼쪽 아래 x,y좌표
for i in range(x, x+10): #색종이의 가로 좌표
for j in range(y,y+10): #색종이의 세로 좌표
points.add((i,j))
print(len(points))
4. 새롭게 알게된 점
✔️set 함수의 존재를 알게됐다.
리스트를 선언할 때와는 다르게 set 생성자로 선언을 한다.
순서가 없고, 집합안에서는 unique한 값을 가진다.
그래서 set에 이미 있는 값을 넣으면 중복된 값은 자동으로 중복이 제거 된다.