Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준 10000번
- 백준 2261번
- 백준 17608번
- 스택(Stack)
- 백준 18352번
- 다익스트라 알고리즘(Dijkstra Algorithm)
- 이분 그래프(Bipartite Graph)
- 백준 1707번
- 알고리즘 개념
- 트리(Tree)
- 동적 프로그래밍(Dynamic Programming)
- 큐(Queue)
- 백준 2493번
- 위상 정렬(Topology Sort)
- 분할 정복(Divide and Conquer)
- 백준 9012번
- 백준 2504번
- 백준 2812번
- 이분 탐색(Binary Search)
- BFS
- DFS(Depth First Search)
- 그리디 알고리즘(Greedy Algorithm)
- 백준 1948번
- 위상 정렬(Topological Sort)
- BFS(Breadth First Search)
- 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm)
- 백준 21606번
- DFS
- DFS & BFS
- 그래프(Graph)
Archives
- Today
- Total
Always Be Wise
스택 : 원 영역(백준 10000번) 본문
728x90
▶ 문제 : https://www.acmicpc.net/problem/10000
10000번: 원 영역
x축 위에 원이 N개 있다. 원은 서로 교차하지 않는다. 하지만, 접할 수는 있다. 원으로 만들어지는 영역이 몇 개인지 구하는 프로그램을 작성하시오. 영역은 점의 집합으로 모든 두 점은 원을 교
www.acmicpc.net
##### 문제 #####
# x축 위에 원이 N개 있다. 원은 서로 교차하지 않는다. 하지만, 접할 수는 있다.
# 원으로 만들어지는 영역이 몇 개인지 구하는 프로그램을 작성하시오.
# 영역은 점의 집합으로 모든 두 점은 원을 교차하지 않는 연속되는 곡선으로 연결될 수 있어야 한다.
##### 입력 #####
# 첫째 줄에 원의 개수 N(1 ≤ N ≤ 300,000)이 주어진다.
# 다음 N개 줄에는 각 원의 정보 xi와 ri가 정수로 주어진다.
# xi는 원의 중심 좌표이며, ri는 반지름이다. (-109 ≤ xi ≤ 109, 1 ≤ ri ≤ 109)
# 입력으로 주어지는 원은 항상 유일하다.
##### 출력 #####
# 첫째 줄에 원으로 인해서 만들어지는 영역의 개수를 출력한다.
▶ 접근 방법
▶ 풀이 코드
import sys
from bisect import bisect_left
sys.setrecursionlimit(100000)
circle_num = int(input())
circle_info = []
for i in range(circle_num):
x, r = map(int, sys.stdin.readline().split())
circle_info.append((x-r, x+r))
# circle_info를 x는 오름차순, y는 내림차순으로 정렬
circle_info.sort(key= lambda x:(x[0], -x[1]))
k = 0
def solve(u, v):
global k
if circle_info[u][1] == circle_info[v][1]:
k += 1
return
pos = bisect_left(circle_info, (circle_info[v][1], -2e9))
if pos == len(circle_info):
return
if circle_info[pos][0] == circle_info[v][1]:
solve(u, pos)
for i in range(circle_num-1):
if circle_info[i][0] == circle_info[i+1][0]:
solve(i, i+1)
print(circle_num + 1 + k)
▶ 관련 링크
2021.11.17 - [알고리즘] - 스택(Stack)이란?
2021.11.17 - [알고리즘] - 스택 : 스택(백준 10828번)
2021.11.17 - [알고리즘] - 스택 : 제로(백준 10773번)
2021.11.17 - [알고리즘] - 스택 : 괄호(백준 9012번)
2021.11.17 - [알고리즘] - 스택 : 막대기(백준 17608번)
2021.11.17 - [알고리즘] - 스택 : 탑(백준 2493번)
'알고리즘 > 백준' 카테고리의 다른 글
스택 : 크게 만들기(백준 2812번) (0) | 2021.11.17 |
---|---|
스택 : 괄호의 값(백준 2504번) (0) | 2021.11.17 |
스택 : 탑(백준 2493번) (0) | 2021.11.17 |
스택 : 막대기(백준 17608번) (0) | 2021.11.17 |
스택 : 괄호(백준 9012번) (0) | 2021.11.17 |
Comments