📄 문제
좌표평면을 좋아하는 진수는 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 함수를 완성하세요.
📝 풀이
#include <string>
#include <vector>
#include <cmath>
using namespace std;
long long solution(int k, int d) {
long long answer = 0;
for (int i = 0; i <= d; i += k)
answer += (long long int)(sqrt(pow(d, 2) - pow(i, 2)) / k + 1);
return answer;
}
- 피타고라스의 법칙을 이용하여 문제를 해결할 수 있습니다.
- 최대 길이가 d를 대각선으로 하였을 때, i는 가로점의 위치입니다. 구하고자하는 세로 점의 위치는 sqrt(pow(d, 2) - pow(i, 2) 계산식으로 구할 수 있습니다. (c^2 = a^2 + b^2)
- 세로 점을 구했으니, k마다 떨어뜨려 점을 찍기에 k로 나눈 후 1을 더하여 각 값을 answer에 더해줍니다.
'algorithms (C++)' 카테고리의 다른 글
[C++][프로그래머스] 할인행사 (0) | 2023.11.07 |
---|---|
[C++][프로그래머스] 귤 고르기 (1) | 2023.11.06 |
[C++][프로그래머스] 디펜스 게임 (0) | 2023.11.06 |
[C++][프로그래머스] 마법의 엘리베이터 (0) | 2023.11.06 |
[C++][프로그래머스] 피로도 (0) | 2023.11.06 |