최근에 본 코테에서 나온 문제인데 프로그래머스에서 알고리즘 문제를 출제하는 기업들의 단골 기출 문제인 듯 하다 실제로 다른 회사에서도 출제된 사례가 있었다.같이 제공되는 이미지도 많이 겹치는 것 같다.
내적의 개념과 응용을 코테에 녹인 문제 인거 같다. 기억이 잘 안나고 그림도 기억나는데로 그려서 올리겠다
문제 :
한 게임의 캐릭터가 스킬을 사용한다.
해당 캐릭터가 스킬 사용시 스킬의 범위는 부채꼴이다.
해당 부채꼴 범위 안에 적이 있다면, 적은 데미지를 받지만, 범위 밖이라면 데미지를 받지 않는다.
데미지를 받는 적의 수를 Return하세요.
조건1 : 스킬을 사용하는 주체인 게임 캐릭터는 항상 0,0 위치에 있다.
조건2 : 적들은 0,0에 있을 수 없으며, 겹쳐있지 않다.
조건3 : 캐릭터와 일직선상에 적이 2명 이상 겹쳐있어도, 범위 안에만 들어오면 데미지를 받는 것으로 인식한다.
주어지는 값 :
1. 스킬을 사용하기위해 위치해있는 마우스 좌표 int x,y
2. 스킬의 길이(반지름) int r
3. 각도 int d
4. 적들의 위치 xn, yn이 담긴 int형 2중벡터 vector<vector<int> > target
============================================================================================
이문제의 경우 나는 단계를 2개로 나눠서 풀 것이다. 1번 해당 적이 나를 기준으로 스킬범위 안에 있는가를 먼저 검증한다.
자 이 공식을 사용하면 된다. 어차피 우리는 좌표가 0,0이기 떄문에 실제로 해당 적의 x좌표의 제곱과 y좌표의 제곱을 더한것에 제곱근이 입력된 스킬의 길이보다 작으면 된다.
또한 게임수학에서 내적은 두 벡터의 각도를 알려준다 이를 이용해 위에서 걸러낸 애들을 2차로 걸러준다. 이 때 우리가 사용할 함수는 acos()이다 이 함수의 경우 안에 내적으로 나온값을 넣어주면 우리가 원하는 각도의 값이 나온다 이를이용해 구현해보도록 하겠다.
자 여기서 빨간 부분을 좌변으로 이항 시켜 보다 그럼 내적을 구하면 벡터의 크기의 곱으로 내적을 나무녀 cos인 값이 나오고 이를 acos에 넣으면 각도인 세타값이 나온다.
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
double Distance(double x, double y) {
double distance;
distance = sqrt(pow(x, 2) + pow(y, 2));
return distance;
}
double DotProduct(double x1, double y1, double x2, double y2) {
return (x1 * x2) + (y1 * y2);
}
double sizeOfVector(double x, double y) {
double size;
size= sqrt(pow(x, 2) + pow(y, 2));
return size;
}
int solution(int x, int y, int r, double d, vector<vector<int>>target) {
int cnt = 0;
for (int i = 0; i < target.size(); i++) {
if (Distance(target[i][0], target[i][1])<=r) {
if (acos(DotProduct(x, y, target[i][0], target[i][1]) / (sizeOfVector(x, y) * sizeOfVector(target[i][0], target[i][1])))<=d) {
cnt += 1;
}
}
}
return cnt;
}
int main() {
vector<vector<int>> target = { {1,3},{1,1},{4,3},{9,9},{-2,8} };
cout<<solution(2, 4, 3, 60, target);
}
이를 코드로 작성하면 이렇게 된다.