x값을 따른 원사이에 있는 최소y값과 최대 y을 계산하고 이를 대칭성을 통해 계산하면 되는 문제이다.
#include <string>
#include <vector>
#include <cmath>
using namespace std;
//한 사분면의 값을 찾아서 4배 시켜주기
long long solution(int r1, int r2) {
long long answer = 0;
for(int i=1;i<=r2;i++){
int maxY = floor(sqrt((long long)r2 * r2 - (long long)i * i)); //최대 Y값 내림해야 경계안쪽의 값까지 구할 수 있다.
int minY = ceil(sqrt((long long)r1 * r1 - (long long)i * i)); //최소 Y값 올림해야 경계바로 바깥쪽까지의 값을 구할 수 있다.
if(r1<i) minY=0; //x값이 r1보다 크면 사이이여서 최소y는 0부터 시작
answer+=(maxY-minY+1); //
}
return answer*4;
}
// 기본 메시지 루프입니다: -> GetMessage는 게임에
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
//대신 사용할거
// 기본 메시지 루프입니다:
while (msg.message!=WM_QUIT)
{
if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else //게임 프레임워크 시작
{
game.Update();
game.Render();
}
}
게임 클래스를 만들어줘서 그곳에서 만드는 것으로 작동하도록 초기화해주기
Game.h 및 Game.cpp
#pragma once
class Game
{
public:
Game();
~Game();
public:
void Init(HWND hwnd); //윈도우 핸들받아줌
void Update();
void Render();
private:
HWND _hwnd;
uint32 _width = 0;
uint32 _height = 0;
};
이때 x를 k의 배수로 d까지 순회하면서 피타고라스 정리를 통해 y의 최댓값을 구하고 이에 따른 정수 점이 몇개나오는 지 몫 나눗셈을 통해 구하면된다.
이때 y가 0일때도 고려해야해서 마지막에 1을 더해준다.
#include <string>
#include <vector>
#include <cmath>
using namespace std;
//최대점 0,d d,0 안에서 정의되는 점의 개수
long long solution(int k, int d) {
long long answer = 0;
for(long long x=0;x<=d;x+=k){ //x에 따른 y값 계산
int maxy=sqrt((long long)d*d-(long long)x*x); //x값에 따른 y의 최대값 계산-> 피타고라스 정리
answer+=(maxy/k)+1; //y의 최대값에 따른 x의 갯수 계산-> 좌표 개수
//+1의 이유: y가 0일때도 포함시키려고
}
return answer;
}