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에 이미 있는 값을 넣으면 중복된 값은 자동으로 중복이 제거 된다.
'알고리즘&자료구조 > Algorithm' 카테고리의 다른 글
프로그래머스 77485 - 행렬 테두리 회전하기 (1) | 2024.04.18 |
---|---|
프로그래머스 87377 - 교점에 별 만들기 (0) | 2024.04.18 |
[백준 2292] 벌집 (1) | 2024.02.08 |
[백준 2903] 중앙 이동 알고리즘 (0) | 2024.02.05 |
[백준 2745] 진법 변환 (1) | 2024.02.05 |