https://www.acmicpc.net/problem/22942
GOLD 5
틀린 내용 지적 환영합니다.
# 시간 초과 - 모든 원 조합을 보는 방법
import sys
input = sys.stdin.readline
def solution(n):
# 데이터 입력
circles = set()
for i in range(n):
x, r = map(int, input().split())
# 중복 방지
if (x, r) in circles:
return "NO"
circles.add((x, r))
# 문제
ordered = sorted(circles, key=lambda x: x[0])
p = 0
for i in range(n):
rA = ordered[p][1]
rB = ordered[i][1]
d = ordered[p][0] - ordered[i][0]
# 외부
if rA + rB < d:
p = i
# 외접
if rA + rB == d:
return "NO"
# 내접 or 교차
if d == abs(rA - rB) or rA + rB > d > abs(rA - rB):
return "NO"
# 내부
if d < abs(rA - rB):
p = p if (rA > rB) else i
return "YES"
32분 정도
시간 초과 (못품)
https://ongveloper.tistory.com/420
# stack 이용
import sys
input = sys.stdin.readline
class Point:
def __init__(self, p, isOpen, no):
self.p = p
self.isOpen = isOpen
self.no = no
def solution(N):
circles = []
for i in range(N):
x, r = map(int, input().split())
# (point, isOpen, circleNo)
circles.append(Point(x - r, True, i)) # == 여는 괄호
circles.append(Point(x + r, False, i)) # == 닫는 괄호
circles.sort(key=lambda x: x.p)
stack = []
for i in range(2*N):
next = circles[i]
current = stack[-1] if stack else next
# same circle: open & close
if current.no == next.no and current.isOpen and not next.isOpen:
stack.pop()
else:
# 기존 원이 열리기 전 다른 원이 닫힐 때
# 즉, 겹치거나 교차할 때
if current.isOpen and not next.isOpen:
print("NO")
return
# 원 정보를 스택에 추가
stack.append(next)
print('YES')
if __name__ == "__main__":
N = int(input())
solution(N)
2
3 1
2 2
단, 아래와 같은 경우는 정상적으로 NO 출력2
2 2
3 1
import sys
input = sys.stdin.readline
class Point:
def __init__(self, p, isOpen, no):
self.p = p
self.isOpen = isOpen
self.no = no
def solution(N):
circles = []
for i in range(N):
x, r = map(int, input().split())
# (point, isOpen, circleNo)
circles.append(Point(x - r, True, i)) # == 여는 괄호
circles.append(Point(x + r, False, i)) # == 닫는 괄호
circles.sort(key=lambda x: x.p)
stack = []
marked = set()
for circle in circles:
next = circle
if next.p in marked: # 내외접
print("NO")
return
if next.isOpen:
stack.append(next)
marked.add(next.p)
elif stack[-1].no != next.no: # 교차
print("NO")
return
else:
marked.add(next.p)
stack.pop()
print('YES')
if __name__ == "__main__":
N = int(input())
solution(N)
# 복잡도: O(nlogn)(정렬) + O(n)(스택) + O(1)*n(집합) = O(nlogn)
스택 쓸 생각을 도대체 어떻게 하지... 와 대박!