SWEA

[D3] SWEA 16910. 원 안의 점

코테봇 2024. 4. 27. 01:52

1.접근 방식

 x*x+y*y<=n*n의 범위를 만족하는

좌표의 갯수를 구하여야한다.(x,y 좌표 = 정수)

 

x의 최소값=0, x의 최대값=n 이란 사실을

어렵지 않게 생각할 수 있다.

y도 마찬가지다.

그렇다면 x의 범위는 0부터 n까지, y의 범위는 0부터 n까지 탐색해주면 된다.

ex) (x,y)= (0,0),(0,1),(0,2) , ~~~, (0,n)

                (1,0),(1,1),(1,2), ~~~, (1,n)

                            ~~~~

                 (n,0),(n,1),(n,2), ~~~ , (n,n)

 

*주의할 점*

 

이 사실은 좌표 평면 위에 원을 그려보면 알 수 있다.

총 4가지의 유형이 있다.

(x,y)=(양수,양수),(양수,음수),(음수,양수),(음수,음수)

       =(x,y),(x,-y),(-x,y),(-x,-y)

(0,0) 같은 경우는 중복이 된다.

이럴 때 중복 개념이 없는 집합(set)에 

넣어버리면 되겠구나라는 아이디어를 떠올랐다.

 

 

3.디테일한 구현

for x in range(0,n+1):
            for y in range(0,n+1): 
                if x*x+y*y<=n*n:
                  circle.add((x,y))
                  circle.add((x,-y))
                  circle.add((-x,y))
                  circle.add((-x,-y))

 

x=0~n, y=0~n

=>즉, x,y 모두 양수인 부분을 탐색해준 뒤

    집합 자료형인 circle 객체에 넣어주면 된다.

 

4. 코드

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if __name__=='__main__':
    #sys.stdin=open('input2.txt','r')   
    
    
    t=int(input()) ## 총 테스트 케이스 개수
    
    for tc in range(t):
        n=int(input()) ##반지름 받기
        circle=set()
        cnt=0
        for x in range(0,n+1):
            for y in range(0,n+1): ##x=양수,y=양수
                if x*x+y*y<=n*n:
                  circle.add((x,y))
                  circle.add((x,-y))
                  circle.add((-x,y))
                  circle.add((-x,-y))
 
       
        cnt=len(circle)
 
cs