DevYoon
[ํ๋ก๊ทธ๋๋จธ์ค] ์ ์ฐ๊ธฐ (Python) ๋ณธ๋ฌธ
link ๐ https://school.programmers.co.kr/learn/courses/30/lessons/140107
๋ฌธ์ ์ค๋ช
์ขํํ๋ฉด์ ์ข์ํ๋ ์ง์๋ x์ถ๊ณผ y์ถ์ด ์ง๊ตํ๋ 2์ฐจ์ ์ขํํ๋ฉด์ ์ ์ ์ฐ์ผ๋ฉด์ ๋๊ณ ์์ต๋๋ค. ์ง์๋ ๋ ์์ ์ ์ k, d๊ฐ ์ฃผ์ด์ง ๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ ์ฐ์ผ๋ ค ํฉ๋๋ค.
- ์์ (0, 0)์ผ๋ก๋ถํฐ x์ถ ๋ฐฉํฅ์ผ๋ก a*k(a = 0, 1, 2, 3 ...), y์ถ ๋ฐฉํฅ์ผ๋ก b*k(b = 0, 1, 2, 3 ...)๋งํผ ๋จ์ด์ง ์์น์ ์ ์ ์ฐ์ต๋๋ค.
- ์์ ๊ณผ ๊ฑฐ๋ฆฌ๊ฐ d๋ฅผ ๋๋ ์์น์๋ ์ ์ ์ฐ์ง ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, k๊ฐ 2, d๊ฐ 4์ธ ๊ฒฝ์ฐ์๋ (0, 0), (0, 2), (0, 4), (2, 0), (2, 2), (4, 0) ์์น์ ์ ์ ์ฐ์ด ์ด 6๊ฐ์ ์ ์ ์ฐ์ต๋๋ค.
์ ์ k์ ์์ ๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ๋ด๋ ์ ์ d๊ฐ ์ฃผ์ด์ก์ ๋, ์ ์ด ์ด ๋ช ๊ฐ ์ฐํ๋์ง return ํ๋ solution ํจ์๋ฅผ ์์ฑํ์ธ์.
์ ํ์ฌํญ
- 1 ≤ k ≤ 1,000,000
- 1 ≤ d ≤ 1,000,000
์๊ฐ์ด๊ณผ ๋ฌ๋ ์ฝ๋
from itertools import product
def solution(k, d):
answer = 0
lst = [k*idx for idx in range(d//k+1)]
limit = d**2
for pro in list(product(lst, repeat=2)):
if pro[0]**2+pro[1]**2 <= limit:
answer += 1
return answer
์ ๋ต ์ฝ๋
import math
def solution(k, d):
answer = 0
# a์ ๋ฒ์๋ 0๋ถํฐ d๊น์ง, k์ฉ ๊ฑด๋๋ด๋ค.
for a in range(0, d+1, k):
# a**2 + b**2 <= d**2
# b**2 <= d**2 - a**2
limit = math.sqrt(d**2 - a**2)
# answer += b์ ๊ฐ์๋ limit์ k๋ก ๋๋ ๋ชซ(k์ฉ ๊ฑด๋๋ฐ๋ฏ๋ก) + 1
answer += limit // k +1
return answer
โ๏ธ ์ฒ์์ ์์ (0, 0)๊ณผ (a, b) ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ (a-0) + (b-0)์ผ๋ก ์๊ฐํ์์ผ๋, ๋ต์ด ์๋์๋ค. ์์ ๊ณผ (a,b) ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ ๋์ ์ฐ๊ฒฐํ ์ ์ ๊ธธ์ด๋ก, ์ผ๊ฐํ์ ๋น๋ณ์ด๋ค.
โ๏ธ ์ฒ์ ํ์ดํ ๋ฐฉ์์ ๋์ฌ ์ ์๋ ์๋ฅผ ๋ด์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ ๊ตฌํด์, ์์ ๊ณผ์ ๊ฑฐ๋ฆฌ๊ฐ d ์ดํ์ธ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด answer์ 1์ฉ ๋ํด์ฃผ๋ ๊ฒ์ด์๋ค. ํ์ง๋ง ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค.
โ๏ธ ๋ค๋ฅธ ๋ถ๋ค์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํด a๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ณ์ฐํ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ ํ๋ค. a**2+b**2 <= d**2 ์ฌ์ผ ํ๋ ์ํฉ์ด๋ฏ๋ก, a๊ฐ ๊ตฌํด์ง๋ค๋ฉด b์ ์ต๋์น๋ d**2-a**2์ ์ ๊ณฑ๊ทผ์ด๋ค. ๋ฐ๋ผ์ ๊ทธ ์ต๋์น๋ฅผ k๋ก ๋๋ ๋ชซ์ 1์ ๋ํด์ฃผ๋ฉด ๋ต์ด ๋์จ๋ค!