Algorithm

[프로그래머스] Level2 - 점 찍기(Javascript)

hotIce 2023. 5. 26. 17:06
728x90
 

프로그래머스

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

programmers.co.kr

▶ 문제 요약

1. 좌표평면을 좋아하는 진수는 x축과 y축이 직교하는 2차원 좌표평면에 점을 찍는다. 

2. 원점(0,0)으로부터 x축 방향으로 a*k,  y축 방향으로 b*k만큼 떨어진 위치에 점을 찍는다. 

3. 원점과 거리가 d를 넘는 위치에는 점을 찍지 않는다. 

 

▶ 실패 코드

function pow(number) {
    return Math.pow(number, 2);
}

function solution(k, d) {
    let answer = 0;
    
    
    for (let x = 0; x <= d; x += k) {
        for (let y = 0; y <= d; y += k) {
            if (pow(d) - pow(x) >= pow(y)) {
                answer ++;
            }
        }
    }
    return answer;
}

▶ 실패 원인

아무 생각없이 2중 for문을 돌렸더니 시간 초과가 떠서 보니 제한사항에 k랑 d의 범위가 1,000,000까지다. 그러니 이걸 이중 반복문을 돌리면 당연히 시간 초과가 난다. 문제를 너무 대충 읽은 내 탓이다. 

 

▶ 성공 코드

function pow(number) {
	return Math.pow(number, 2);
}

function solution(k, d) {
    let answer = 0;
    
    
    for (let x = 0; x <= d; x+=k) {
    	// 원의 방정식 활용 
        maxY = Math.sqrt(pow(d) - pow(x));
        
        // 만약에 k로 나눠 떨어지면 + 1을 해야한다. 
        answer += Math.ceil(maxY / k) + (MaxY % k === 0 ? 1 : 0)
    
    }
    
    return answer;
    
}

▶ 풀이 과정

1. 이중 반복문을 사용했더니 위에 처럼 시간 초과가 떴으니 다른 방법을 활용해야 한다. 이 문제는 점들이 원의 내부에 찍힌다는 것이 포인트고, 원의 방정식 x^2 + y^2 = d^2이다. 내부에 점이 찍히는 것이라서 d^2이하이면 된다. sqrt 제곱근 함수를 사용한 이유는 y^2의 값을 구하는 것이 아니라 y를 구하려면 제곱을 오른쪽으로 이항하고 제곱근이 된다. 

 

2. 만약에 k로 나눠 떨어지면 +1을 하는 경우는 예로 설명하겠다. maxY가 4이고, k = 2이다 그럼 몫이 2가 된다. (0, 0), (0, 2), (0, 4)가 되어야 하는데 1개가 부족하다 그래서 1을 더해준다. 다른 예시로 maxY가 4.2이고, k = 2가 된다면, 몫은 2.1이 되고 Math.ceil() 올림 함수 때문에 3이되고 (0,0), (0, 2), (0,4)까지의 위치의 개수를 잘 얻을 수 있다. 

728x90