백준 22942 데이터 체커 풀이

Hyunta·2022년 11월 15일
0
post-custom-banner

접근방법

처음에 그냥 원을 그려봤다.
원이 겹치는 경우는 닫히는 시점에 열려있는 원이 있으면 겹치게 된다.
예를 들면 [], () 를 각 원의 시작점과 끝점이라고 했을 때
[(]) 처럼 원이 열린 상태로 끝나게 되는 경우 접점이 생기게 된다.
따라서 스택으로 값을 저장하다가 만약 열려있는 원이 있는 상태에서 닫히게 된다면 접한다고 풀었다.

구현

1. 원 등록하기

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)을 부여했다.

2. 겹치는 원 확인하기

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를 반환해주면 끝난다.

profile
세상을 아름답게!
post-custom-banner

0개의 댓글