본문 바로가기

Algorithm/Programers - C++

[프로그래머스] 점 찍기

 

Level. 2

 

문제

좌표평면을 좋아하는 진수는 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

 

풀이

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

long long solution(int k, int d) {
    long long answer = 0;
    long long dd = (long long)d*d;
    // x로 y의 최대값 구하기
    for(long long x=0 ; x<=d; x+=k){
        long long y = floor(sqrt(dd - (x*x)));
        answer += (y/k)+1;
    }
    
    return answer;
}

 

x와 y를 이중포문을 사용하여 각각 구할 경우 시간초과 문제가 발생한다. 

그러나 위 문제는 x를 알게되면 저절로 y의 개수를 예상할 수 있다. (x를 통해 최대 y값이 구해진다.)

따라서 for문 하나로 x를 구한 후 그에 따라오는 y의 개수를 answer에 더해주는 식으로 문제를 풀이하였고, 이 경우 시간초과 문제가 발생하지 않았다. 

 


https://school.programmers.co.kr/learn/courses/30/lessons/140107

 

프로그래머스

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

programmers.co.kr