[프로그래머스] 점 찍기(C++)

이얀조·2023년 8월 14일
0

🎀프로그래머스

목록 보기
18/21

점찍기 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

🏘 풀이


C++ 은 자료형과 관련된 문제가 더러 나오는 것 같다.
이 문제는 애초에 반환변수 answer의 자료형 또한 long long 으로 기재되어 제공된다.

따라서 본인은 long long 을 집중해서 보려고 했다.
물론 마지막에 까먹음ㅠ . ㅠ

그냥 반복문으로 구하려고 하면 무조건 시간초과 가 난다 !

따라서 주어진 kd 를 활용해 반목문의 횟수를 조절하거나 아예 계산하는 방법을 고려해보았다.

나는 이때 계산하는 방법으로 해결했다.

먼저 문제에서 구하고자하는 좌표의 범위는 아래 그림과 같다.

이때 또 주의해야할 점은 거리가 d 인 좌표들 이므로 포함 관계임을 명시해야한다.

나는 반복문을 x 좌표를 돈다고 가정하고 d / k 만큼 반복시켰다.
(반복문 내에서 d * k 연산을 진행하기 위해)

이후 tmp 라는 변수에 전체 길이 d^2 에서 (i * k)^2 값을 빼주어 할당하였고 해당 tmp의 루트값에 k를 나눈값이 0 을 제외한 값이 된다!
-> k 를 나누는 이유는 k 배 한 좌표값을 구해야 하기 때문

이때 가장 주의할 것은 powsqrt 가 아닌 powlsqrtl을 사용해야하는 것!

안그러면 또 100점으로 통과가 불가능하다.

왜냐하면 계산 결과가 int 값을 넘는 결과가 나올수 있기 때문!

📦 코드


#include <string>
#include <vector>
#include <iostream>
#include <cmath>
using namespace std;

long long solution(int k, int d) {
    long long answer = 0;
    
    for (long long i = 0; i <= d / k; i++) {
        long long tmp = powl(d, 2) - powl(i * k, 2);
        
        answer += sqrtl(tmp) / k + 1;
    }
    return answer;
}

🧩 어려웠던 점

  • 자료형에 주의하여 문제를 풀자 . .
profile
이얀조다!

0개의 댓글