Post
데이터 체커(백준 22942번) | Gihun Son

데이터 체커(백준 22942번)

문제

원 이동하기 2 문제를 만들고 만든 데이터가 문제의 조건에 맞는지 확인하는 코드를 작성해야한다.

해당 문제의 데이터는 아래 조건들을 만족해야한다.

  1. 모든 원의 중심 좌표는 $x$축 위에 존재해야 한다.

  2. $N$개의 원 중 임의의 두 원을 선택했을 때, 교점이 존재하지 않아야 한다. 즉, 하나의 원이 다른 원 안에 존재하거나 외부에 존재한다.

데이터 형식은 원의 개수 $N$이랑 각 원의 중심$x$좌표, 원의 반지름 $r$만 주어진다. 따라서, 2번 조건을 만족하는지만 확인하면 된다.

주어진 데이터가 해당 조건을 만족하는지 확인해보자.

Untitled

Untitled 1

나의 풀이(정답 참고)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import sys
N=int(input())

stack=[]
for i in range(N):
    x,r=map(int,sys.stdin.readline().strip().split())
    stack.append((x-r,i))
    stack.append((x+r,i))
stack.sort()
ans=[]
for s in stack:
    if ans:
        if ans[-1][1]==s[1]:
            ans.pop()
        else:
            ans.append(s)
    else:
        ans.append(s)
  
if ans:  
    print('NO')
else:
    print('YES')

  • 원의 양 끝 점을 ‘(’, ‘)’ 이러한 괄호라고 생각하면 편하다. ‘(())’ 이런 괄호는 원래 문제가 없지만, 원으로 따졌을 때, $(_a(_b)_a)_b$ 이렇게 a, b 두 종류의 괄호(원)이 있다고 했을 때, 만나는 점이 생기는 것이다.
  • 따라서 stack을 사용하여 문제를 풀었다.
    • 의문이 드는 것은, 원이 한점에서 만나는 것은 고려하지 않은 것 같은데, 정답 처리가 되었다는 것이다. 나중에 더 알아봐야 한다.
This post is licensed under CC BY 4.0 by the author.