본문 바로가기
algorithm

[JS] 프로그래머스 점찍기

by HomieKim 2023. 7. 30.

https://school.programmers.co.kr/learn/courses/30/lessons/140107?language=javascript 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

풀이

문제를 조금 풀어서 설명 하자만 x,y 축에 k의 배수 씩 점을 찍을 건데 원점과 거리가 d를 넘으면 점을 찍지 않는 것!

문제 풀이의 핵심은  원점과의 거리를 구하는 것입니다.

d^2 = x^2 + y^2

위 공식을 기반으로 점을 찍을 좌표가 원점과의 거리가 d 보다 크지 않으면 answer를 올려주면 됩니다.

 

주의 해야할 점은 d,k의 인풋이 최대 1000000 이기 때문에 이중 반복문돌리면 시간 초과 나게 됩니다. 

예를 들어

function solution(k, d) {
    var answer = 0;
        
    for(let x =0 ; x <= d; x+= k) {
        for(let y = 0; y<=d; y+=k){
            
            if((x**2 + y**2) <= d*d){
                answer++;
            }
        }
    }
    
    return answer;

}

이렇게 이중 반복으로 코드를 짜면 워스트 케이스가 O(n^2) 이니까 백만일 때 시간초과 납니다.

반복문 한 번에 O(n)에 해결하는 방법을 찾아야 하는데 ,
x 좌표 값을 반복 할 때 최대 y 값 좌표를 찾아서 해당 k로 나누면 해당 x 좌표에 해당하는 점들을 계산할 수 있습니다.

Code

function solution(k, d) {
    let answer = 0;
    for(let i = 0; i <= d; i+=k){
        let y = Math.sqrt(d**2 - i**2); // 최대 y 값
        answer += Math.floor(y/k) + 1; // 해당 y 값의 k 배수 갯수 + 1
    }
    return answer;
}

'algorithm' 카테고리의 다른 글

JS로 BFS, DFS 구현  (0) 2023.07.19
최장 공통 부분 수열(LCS)  (0) 2022.02.15
퀵 소트(Quick Sort)  (0) 2021.10.06
병합정렬 (Merge Sort)  (0) 2021.09.24
기수정렬 (Radix sort)  (0) 2021.09.15

댓글