[D3] SWEA 16910. 원 안의 점
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 |