[CDT - Javascript] 프로그래머스 연습문제 @ 점 찍기

김현수·2024년 1월 15일
0

cdt

목록 보기
43/51


🖋️ 점 찍기


# 문제 설명

좌표평면을 좋아하는 진수는
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
    • 원점과의 거리를 나타내는 정수 d
  • 반환값

    • 점이 총 몇 개 찍히는지 return

  • 📢 제한사항

    • 1 ≤ k ≤ 1,000,000
    • 1 ≤ d ≤ 1,000,000

  • 📰 입출력 예시

kdd
246
156



  • 실패한 CODE

// 복잡하게 생각해서 필요한 point 의 값들을
// 반복문으로 arr 에 추가한 다음 set 으로 중복갑 없애기
function solution(k, d) {
    let answer = [[0,0]];
    
    const points = [];
    for (let i = 1; i*k <= d; i++) {
        points.push(i*k);
        answer.push([0, i*k]);
        answer.push([i*k, 0]);
    }
    
    for (let p1 of points) {
        for (let p2 of points) {
            const len = Math.sqrt(p1*p1 + p2*p2);
            if (len <= d){
                answer.push([p1,p2])
                answer.push([p2,p1])
            } else {
                break;
            }
        }
    }
    
    const unique = Array.from(new Set(answer.map(a => JSON.stringify(a))), json => JSON.parse(json));
    
    return unique.length;
}

  • 성공한 CODE

function solution(k, d) {
    let answer = 0;

    for(let x=0; x<=d; x+=k){
        // 해당 x 좌표에서 최대 y 거리 (원의 방정식)
        const maxY = ~~(Math.sqrt(d*d - x*x));
        // k의 배수, 0 포함
        answer += ~~(maxY / k)+1;
    }
    return answer;
}

풀이

  • 원의 방정식을 통해 solution 구하기

  • 원의 방정식을 통해 해당 x 좌표마다 최대 y 좌표 구하기
  • 해당 y 좌표는 k 배수와 0 을 포함한 좌표의 개수
profile
일단 한다

0개의 댓글