for (int i = 0; i < 4; i++) {
price[cnt].first = (100 - dis[i]) * emoticons[cnt] / 100; // 할인된 가격
price[cnt].second = dis[i]; // 할인율
dfs(cnt + 1, n, users, emoticons);
}
한 할인율을 이모티콘들에 다 적용했을 때의 이윤계산
if (cnt == n) { // 모든 이모티콘에 할인율을 대입했을 때
int plus = 0, sum = 0;
for (int i = 0; i < users.size(); i++) {
int tmp = 0;
for (int j = 0; j < n; j++)
if (users[i][0] <= price[j].second) // 원하는 할인율 이상이면 구매
tmp += price[j].first;
if (tmp >= users[i][1]) // 구매값이 정해진 가격 이상이면 이모티콘플러스 가입
plus++;
else
sum += tmp; // 이윤++
}
if (plus > answer[0]) { // 가입자수가 더 많으면
answer[0] = plus;
answer[1] = sum;
} else if (plus == answer[0] && sum >= answer[1])
answer[1] = sum; // 가입자수가 같고 이윤이 크면
return;
}
전체코드
#include <string>
#include <vector>
using namespace std;
int dis[4] = {40, 30, 20, 10}; // 할인율
vector<pair<int, int>> price(7, {0, 0}); // 할인된 가격, 할인율
vector<int> answer(2, 0);
void dfs(int cnt, int n, vector<vector<int>> users, vector<int> emoticons) {
if (cnt == n) { // 모든 이모티콘에 할인율을 대입했을 때
int plus = 0, sum = 0;
for (int i = 0; i < users.size(); i++) {
int tmp = 0;
for (int j = 0; j < n; j++)
if (users[i][0] <= price[j].second) // 원하는 할인율 이상이면 구매
tmp += price[j].first;
if (tmp >= users[i][1]) // 구매값이 정해진 가격 이상이면 이모티콘플러스 가입
plus++;
else
sum += tmp; // 이윤++
}
if (plus > answer[0]) { // 가입자수가 더 많으면
answer[0] = plus;
answer[1] = sum;
} else if (plus == answer[0] && sum >= answer[1])
answer[1] = sum; // 가입자수가 같고 이윤이 크면
return;
}
for (int i = 0; i < 4; i++) {
price[cnt].first = (100 - dis[i]) * emoticons[cnt] / 100; // 할인된 가격
price[cnt].second = dis[i]; // 할인율
dfs(cnt + 1, n, users, emoticons);
}
}
vector<int> solution(vector<vector<int>> users, vector<int> emoticons) {
dfs(0, emoticons.size(), users, emoticons);
return answer;
}
이 상자를 순회하면서 문제에서 주어진 방식대로 상자 안의 숫자로 계속 상자를 방문처리하면서 그룹을 나누고 만약 그룹이 2개보다 작다면 0점이고 아니라면 그룹 수 중에 제일 많은 수와 그 다음으로 많은 수를 곱해서 반환해주면 된다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// 특정 시작점에서 그룹의 크기를 찾는 함수
int find_group(int start, vector<int>& cards, vector<bool>& visited) {
int group_size = 0; // 그룹 크기 초기화
int current = start; // 현재 상자를 시작 상자로 설정
while (!visited[current]) { // 현재 상자가 방문되지 않은 동안 반복
visited[current] = true; //방문처리
current = cards[current] - 1; // 상자 안의 숫자를 통해 다음 상자 선택
group_size += 1; // 그룹 크기를 증가시킴
}
return group_size;
}
int solution(vector<int> cards) {
int n = cards.size(); // 상자의 수
vector<bool> visited(n, false); // 방문 여부를 저장
vector<int> group_sizes; // 각 그룹의 크기를 저장
// 모든 상자에 대해 그룹을 찾음
for (int i = 0; i < n; ++i) {
if (!visited[i]) { // 현재 상자가 방문되지 않았다면
int group_size = find_group(i, cards, visited); // 그룹의 크기를 찾음
group_sizes.push_back(group_size); // 그룹 크기를 벡터에 추가
}
}
// 그룹 크기를 내림차순으로 정렬
sort(group_sizes.rbegin(), group_sizes.rend());
// 최대 점수를 계산
if (group_sizes.size() < 2) { // 그룹이 2개 미만이면
return 0; // 점수는 0
} else {
return group_sizes[0] * group_sizes[1]; // 가장 큰 두 그룹의 크기를 곱한 값이 최대 점수
}
}
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;
};