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
'Algorithm > Programers - C++' 카테고리의 다른 글
[프로그래머스] 광물캐기 / Greedy , DFS(백트래킹) (1) | 2024.02.28 |
---|---|
[프로그래머스] 디펜스 게임 / priority_queue (1) | 2024.02.27 |
[프로그래머스] 리코쳇 로봇 / bfs (0) | 2024.02.04 |
[프로그래머스] 하노이의탑 / 재귀함수 (0) | 2024.01.29 |
[프로그래머스] 테이블 해시 함수 / sort, 람다 (0) | 2024.01.20 |