[프로그래머스] 점 찍기

Narcoker·2022년 12월 9일
0

코딩테스트

목록 보기
71/150

문제 설명

좌표평면을 좋아하는 진수는 x축과 y축이 직교하는 2차원 좌표평면에 점을 찍으면서 놀고 있습니다. 진수는 두 양의 정수 k, d가 주어질 때 다음과 같이 점을 찍으려 합니다.

원점(0, 0)으로부터 x축 방향으로 ak(a = 0, 1, 2, 3 ...), y축 방향으로 bk(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

풀이

x^2 + y^2 = d^2 인 원 그래프 내에서
x y 모든 좌표의 값이 k 배수인 점을 구하는 문제이다.

x 좌표는 d 보다 작은 k 배수 이므로 x좌표룰 순회하면서
y 좌표의 최대 값을 구한다.
y 좌표의 최대 값을 k로 나누면
원 그래프 내의 k배수인 y의 좌표의 개수가 나온다.
그 값과 원점을 포함한 값을 answer에 더해준다.

function solution(k, d) {
    var answer = 0;
    for(let i = 0; i <= d; i+=k){
        let y = Math.sqrt(d**2 - i**2);
        answer+= Math.floor(y/k) + 1;
    }
    return answer;
}

회고

제한사항을 보고 그냥 풀었다간 시간복잡도가 커질 것 같음을
미리 예측하고 수학적으로 접근을 시도했다.
차차 나아지고 있는 것 같다.

profile
열정, 끈기, 집념의 Frontend Developer

1개의 댓글

comment-user-thumbnail
2023년 2월 22일

덕분에 좋은 내용 잘 보고 갑니다.
정말 감사합니다.

답글 달기