두 원 사이의 정수 쌍 문제 바로가기

첫 번째 풀이

def solution(r1, r2):
    answer = 0
    for i in range(-r2,r2+1):
        for j in range(-r2,r2+1):
            if r1**2 <= i**2 + j**2 <= r2**2:
                answer += 1
    return answer

두 번째 풀이

def solution(r1, r2):
    answer = 0
    for i in range(1,r2+1):
        for j in range(1,r2+1):
            if r1 <= (i**2 + j**2)**0.5 <= r2:
                answer += 1
    answer = (answer + r2 - r1 + 1)*4         
    return answer

세 번째 풀이

from math import ceil, floor

def solution(r1, r2):
    answer = 0
    for x in range(1,r2+1):
        y_top = floor((r2**2-x**2)**0.5)
        b_bot = ceil((r1**2-x**2)**0.5) if x<=r1 else 0
        answer += y_top - b_bot + 1         
    return answer * 4

CODE REVIEW

  1. 첫 번째 풀이에서는 일부 테스트에서 시간 초과에러가 5개에서 발생해서 실패했다. 1사분면만 구하고 4배 취해야겠다…
  2. 두 번째 풀이에서는 사분면만 먼저 계산하고 4배해주었는데 여전히 시간초과 에러가 3개 발생한다. 이중 for문이라 그런듯… 구조를 아예 바꿔야하나?
  3. 세 번째 풀이에서는 이중 for문을 피하기 위해 x값을 기준으로 최대/최소 y값을 구해서 갯수를 구했다. 결국 해결 완료! 시간 초과 쉽지 않구만 허허…