처음에 그냥 원을 그려봤다.
원이 겹치는 경우는 닫히는 시점에 열려있는 원이 있으면 겹치게 된다.
예를 들면 [], ()
를 각 원의 시작점과 끝점이라고 했을 때
[(])
처럼 원이 열린 상태로 끝나게 되는 경우 접점이 생기게 된다.
따라서 스택으로 값을 저장하다가 만약 열려있는 원이 있는 상태에서 닫히게 된다면 접한다고 풀었다.
n = int(input())
squares = []
for i in range(n):
x, r = map(int, input().split())
squares.append([x - r, i, 0])
squares.append([x + r, i, 1])
squares.sort(key=lambda x: x[0])
원을 등록할 때 해당 원의 식별값과 시작점인지 끝점인지를 구별하기 위해서 각각 i값과 (0,1)을 부여했다.
def check():
stack = []
for square in squares:
x, num, state = square
if state == 1:
pop = stack.pop()
if pop[1] != num:
return "NO"
else:
stack.append(square)
return "YES"
stack에 원이 열리는 시점을 담고, 원이 닫힐 때 열려있는 원과 식별값이 일치하는지 확인한다. 만약 열려있는 원이 다른 식별값을 갖고 있으면 NO를 반환해주면 끝난다.