컨디션이 좋지 않아 문제 해석 후 풀다가 멈췄습니다.
내일 더 풀어보고 어느정도 정리해서 올려보겠습니다.
'개발일지' 카테고리의 다른 글
20.07.22 비개발일지 (0) | 2020.07.22 |
---|---|
20.07.21 비개발일지 (0) | 2020.07.21 |
20.07.17 비개발일지 (0) | 2020.07.17 |
20.07.14 비개발일지 (0) | 2020.07.14 |
20.07.01 비개발일지 (0) | 2020.07.01 |
컨디션이 좋지 않아 문제 해석 후 풀다가 멈췄습니다.
내일 더 풀어보고 어느정도 정리해서 올려보겠습니다.
20.07.22 비개발일지 (0) | 2020.07.22 |
---|---|
20.07.21 비개발일지 (0) | 2020.07.21 |
20.07.17 비개발일지 (0) | 2020.07.17 |
20.07.14 비개발일지 (0) | 2020.07.14 |
20.07.01 비개발일지 (0) | 2020.07.01 |
컨디션이 좋지 않아 오늘과 내일은 일단 휴식을 취하겠습니다.
따로 공부는 할 수도 있지만 보장을 못하니 비개발일지를 적습니다.
20.07.21 비개발일지 (0) | 2020.07.21 |
---|---|
20.07.17 비개발일지 (0) | 2020.07.17 |
20.07.14 비개발일지 (0) | 2020.07.14 |
20.07.01 비개발일지 (0) | 2020.07.01 |
20.06.23 비개발일지 (0) | 2020.06.23 |
https://www.acmicpc.net/problem/2258
백준 사이트에서 풀 수 있는 정육점 문제입니다.
카테고리는 Greedy입니다.
19일 전에 처음 시도했던 이 문제를 중간에 과제 기간이라 하여 일주일 쉬긴 했지만 3주만에 드디어 풀었습니다.
풀면서 제가 막히거나 신경 쓴 부분은 다음과 같습니다.
1. 가격이 더 싼 고기를 무료로 얻을 수 있으므로 가격을 오른차순으롱 먼저 정렬하고,
무게를 빠르게 채워야 하므로 가격이 동일 한 경우 무게를 내림차순으로 정렬한다.
2. 가격이 더 싼 고기를 무료로 얻는다고 했지 가격이 같은 고기를 무료로 얻는다고는 안했다.
동일한 가격에 대해 누적된 가격을 계산해야 한다.
3. 2의 과정이 무게가 목표치보다 낮을 경우와 높을 경우에 필요한 연산이 다르다.
목표치보다 낮으면 항상 가격이 누적되고, 변동된 가격이 들어오더라도 이전 가격을 무시하면 된다.
반대로 목표치보다 높으면 가격을 더이상 누적하지 않고, 현재 최소 가격과 현재 가격만을 비교한다.
4. 모든 고기의 무게와 가격의 각 합인 unsigned int의 최대 값보다 작거나 같다.
때문에 조건에 부합하지 못해 -1을 출력해야 할 때 단순한 삼항연산자 등을 이용하면 <2^32 - 1>이 출력된다.
번거롭더라도 if문을 사용하거나, 출력 전에 string으로 형변환을 하는 등의 작업을 선행하자.
매우 간단하고, 처음에도 간단하다고 생각 했는데 3번 부분을 항상 놓치거나 잘못 작성하여 정답을 맞추지 못했다.
그리고 여태까지 문제를 풀면서 몇몇 문제는 정답 코드를 참조하기도 했는데,
이 문제는 정답률이 낮아서인지 마땅한 코드가 거의 없다.
아니, 그냥 검색 결과가 2개 정도 밖에 없다.
그래서 일부로 글 앞에 검색에 걸릴만한 내용을 추가하고, 하단에 코드를 작성했다.
이 문제에 막혀 참고를 하고자 하시는 분들은 다음 코드를 참고하시면 될 것 같다.
#include <iostream>
#include <vector>
#include <algorithm>
struct chunk {
unsigned int weight;
unsigned int price;
};
using namespace std;
int main()
{
unsigned int length = 0, needs = 0, weight = 0, price = 0, before = -1;
vector<struct chunk> meatlist;
cin >> length >> needs;
for (int i = 0; i < length; ++i)
{
cin >> weight >> price;
meatlist.push_back(chunk{ weight, price });
}
sort(meatlist.begin(), meatlist.end(), [](const auto& a, const auto& b) { return ((a.price < b.price) || (a.price == b.price) && (a.weight > b.weight)); });
weight = price = 0;
for (const auto& iter : meatlist)
{
if (weight < needs)
{
if (before == iter.price)
{
price += iter.price;
}
else
{
before = price = iter.price;
}
}
else
{
if ((before != iter.price) && (price >= iter.price))
{
before = price = iter.price;
}
}
weight += iter.weight;
}
if (weight < needs)
{
cout << -1 << endl;
}
else
{
cout << price << endl;
}
return 0;
}
혹 몇가지 testcase가 필요하신 분들은 아래 파일에 있는 것을 참고하시길.
유의미 하지는 않지만 그래도 없는 것 보다는 나을 것이다.
20.07.20 개발일지 - 무어 기계(cont) (0) | 2020.07.20 |
---|---|
20.07.19 개발일지 - 무어 기계(cont) (0) | 2020.07.19 |
20.07.15 개발일지 - 정육점(fail) (0) | 2020.07.15 |
20.07.13 개발일지 - 정육점(cont) (0) | 2020.07.13 |
20.06.28 개발일지 - 정육점(실패) (0) | 2020.06.29 |
Puzzle을 기능 기준으로 수정 하려다가 수 많은 에러에 맞고 쓰러졌습니다.
Puzzle의 코어한 부분들이 모두 Blueprint로 구현되어 있었기에 기능 구현이고 뭐고
일단 C++ 스크립트로의 수정 과정이 선행 되어야 했습니다.
그래서 안타깝게도 하루만에 순서를 바꾸어 Interface 적용을 앞땡겼습니다.
Interface를 적용하고자 하는 부분을 탐색해보자 정말 수 많은 선택지가 펼쳐졌습니다.
그 중에서 단순 생성과 관련된 함수나, 외부에서 접근할 필요가 없는 트리거에 대한 변경 함수를 제외하고
나머지 상태 확인이나 트리거 변경, 선언 함수들을 Interface로 엮었습니다.
그 결과는 다음과 같습니다.
IDamagable
IDamageActivity
IAttachable
ICheckAnswer
ICheckInRangeCharacter
IObjectActiviy
IProjectileActivity
IClimbable
IClimbActivity
이들을 하나씩 적용하고, 이미 기능이 적용 되어 있다면 이를 수정 할 예정입니다.
이 외에 변경점이라면 이전에 Climb 기능 구현을 하면서 터득한
Animation Notify를 이용해 Melee Attack 기능을 개선하고자 합니다.
우선 Hit 이벤트가 여러번 발생하는 것을 막아주는 Lock을 Semaphore로 변경하고자 합니다.
이를 통해 한 Character에게는 한번의 이벤트만 발생하지만, 한번에 여러 Character에게 이벤트가 발생할 수 있습니다.
그리고 데미지 계산이나 Semaphore 연산을 RPC 함수를 이용하고자 합니다.
그리고 Wall을 분할하고자 합니다.
현재의 Wall은 Character의 이동 경로를 막는 방해물과 등반 가능한 등반 Object가 동시에 혼용되고 있습니다.
이를 두개로 나누어 기존의 Wall은 후자의 것으로 사용하고,
전자의 것에 어울리는 새로운 Object를 생성하고자 합니다.
마지막으로 Puzzle을 새로 개발하고자 합니다.
BP 기반에 이전 Trap에 너무 의존적이었기에 완전히 삭제하고, 새로운 Puzzle을 개발하고자 합니다.
이번에는 UI 등 편의성을 개선할 계획도 있습니다.
새로운 Puzzle은 기존의 Break, Select를 우선 구현하고, 새로운 것을 구현할지 그때 가서 고민하려 합니다.
진행 순서는
1. Character 자체 기능 개선
2. Wall 분할
3. Climb 기능 개선
4. Trap 기능 개선
5. Puzzle 생성
입니다.
20.07.22 개발일지 (0) | 2020.07.22 |
---|---|
20.07.20 개발일지 (0) | 2020.07.20 |
20.07.15 개발일지 (0) | 2020.07.15 |
20.07.10 개발일지 (0) | 2020.07.10 |
20.07.09 개발일지 (0) | 2020.07.09 |
#include <iostream>
#include <vector>
#include <algorithm>
struct chunk {
unsigned int weight;
unsigned int price;
};
using namespace std;
int main()
{
unsigned int length = 0, needs = 0, weight = 0, price = 0, before = -1;
vector<struct chunk> meatlist;
cin >> length >> needs;
for (int i = 0; i < length; ++i)
{
cin >> weight >> price;
meatlist.push_back(chunk{ weight, price });
}
sort(meatlist.begin(), meatlist.end(), [](const auto& a, const auto& b) { return ((a.price < b.price) || (a.price == b.price) && (a.weight > b.weight)); });
weight = price = 0;
for (const auto& iter : meatlist)
{
if (weight < needs)
{
if (price > iter.price)
{
before = price = iter.price;
}
else
{
if (before == iter.price)
{
price += iter.price;
}
else
{
before = price = iter.price;
}
}
}
else
{
if ((price > iter.price) && (before != iter.price))
{
before = price = iter.price;
}
}
weight += iter.weight;
}
if (weight < needs)
{
cout << -1 << endl;
}
else
{
cout << price << endl;
}
return 0;
}
구상한 코드가 틀려 몇일 정도 다시 예외 상황이나 문제점을 고민해보도록 하겠습니다.
20.07.19 개발일지 - 무어 기계(cont) (0) | 2020.07.19 |
---|---|
20.17.16 개발일지 - 정육점(fin) (0) | 2020.07.16 |
20.07.13 개발일지 - 정육점(cont) (0) | 2020.07.13 |
20.06.28 개발일지 - 정육점(실패) (0) | 2020.06.29 |
20.06.27 개발일지 - 謎紛芥索紀 (Large) (0) | 2020.06.27 |
오늘은 Spawn Object의 Collision과 Hidden을 어떻게 처리할지 고민을 좀 하였습니다.
처음에는 Interface를 사용하지 않고 한번 구현해 보려 했으나,
Character와 Object를 모두 Spawn하려면 결국 Interface를 쓰거나,
Spawn Trap을 Object Spawn고 Character Spawn으로 다시 나누거나,
Object의 근간인 THObject의 내용을 Interface로 따로 빼내거나 해야 합니다.
결국 Interface를 쓰거나 구조를 바꾸거나 둘 중 하나입니다.
여기서 고민이 생기기 시작합니다.
Interface를 쓰지 않는다면 지금 당장 가장 빠르게 구현을 할 수 있겠지만,
앞으로도 이런 문제를 직면 하면 SubClass를 쪼개줘야 할 것입니다.
어쩌면 동시에 두 가지 기준을 잡는다면 Class를 4개 이상으로 쪼개야 할 것입니다.
Interface를 쓴다면 지금과 같은 문제를 효과적이고 가장 좋은 방법으로 해결할 것입니다.
하지만 현재 Interface를 생성하는 방식을 정확히 파악하지 못하고 있고,
또 Document에서 제시된 것으로 보아 여태까지 개발해온 많은 상호작용들을
Interface로 엮어서 다시 구현해야 할 것 같습니다.
다른 작업이 덩쿨에 엮이듯이 줄줄이 딸려 오는 것이죠.
VS 업데이트 2시간 동안 상당히 고민을 하다가 잠들고, 다시 일어나 고민 한 끝에
Interface를 적용하기로 결정했습니다.
단, 우선순위는 뒤로 미룰 것입니다.
일이 어느정도 마무리가 되고 나서 Interface를 전반적으로 적용을 하고자 합니다.
그래서 빠르면 이번주. 혹은 다음주부터 Puzzle쪽 기능을 우선 구현하고자 합니다.
Puzzle의 Multiplay상 기능 구현이 완료가 되면, Project 전반적으로 Interface 분리 작업을 진행 할 것입니다.
그 뒤에는 Level에 특정 스크립트를 C++로 적용할 수 있는지 조사할 계획입니다.
이는 Teleport나 Brush등의 기능들에 필요하다고 판단이 되며,
후에 구조와 기능에 따라 다른 Trap들도 다시 한번 수정을 할 수도 있을 것입니다.
20.07.20 개발일지 (0) | 2020.07.20 |
---|---|
20.07.16 개발일지 (0) | 2020.07.16 |
20.07.10 개발일지 (0) | 2020.07.10 |
20.07.09 개발일지 (0) | 2020.07.09 |
20.07.08 개발일지 (0) | 2020.07.08 |
DirectX 공부가 너무 늦게 끝나 미처 알고리즘을 하지 못했습니다.
매일매일 하는 것은 어떻게 보면 남는 시간을 투자하고자 하는 것이기에 이런 문제가 생기네요.
아무래도 일시적이지만 투자 시간이 늘어나기도 했고,
이론에서 프로그래밍 입문으로 넘어가는 단계라 시간과 체력 소모가 큽니다.
정육점 문제 더럽게 안풀리던데 시간이 얼마가 걸리든 정답은 보고 다음 문제 넘어가렵니다.
20.07.17 비개발일지 (0) | 2020.07.17 |
---|---|
20.07.17 비개발일지 (0) | 2020.07.17 |
20.07.01 비개발일지 (0) | 2020.07.01 |
20.06.23 비개발일지 (0) | 2020.06.23 |
20.06.13 비개발일지 (0) | 2020.06.13 |
virtual void STDMETHODCALLTYPE IASetPrimitiveTopology(
_In_ D3D12_PRIMITIVE_TOPOLOGY PrimitiveTopology) = 0;
typedef
enum D3D12_PRIMITIVE_TOPOLOGY_TYPE
{
D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED = 0,
D3D12_PRIMITIVE_TOPOLOGY_TYPE_POINT = 1,
D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE = 2,
D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE = 3,
D3D12_PRIMITIVE_TOPOLOGY_TYPE_PATCH = 4
} D3D12_PRIMITIVE_TOPOLOGY_TYPE;
https://docs.microsoft.com/ko-kr/windows/uwp/graphics-concepts/primitive-topologies
Vertex quad[6] = {
v0, v1, v2, // 삼각형 0
v0, v2, v3 // 삼각형 1
};
Vertex octagon[24] = {
v0, v1, v2, // 삼각형 0
v0, v2, v3, // 삼각형 1
v0, v3, v4, // 삼각형 2
v0, v4, v5, // 삼각형 3
v0, v5, v6, // 삼각형 4
v0, v6, v7, // 삼각형 5
v0, v7, v8, // 삼각형 6
v0, v8, v1 // 삼각형 7
};
Vertex v[4] = { v0, v1, v2, v3 };
UING indexList[6] = { 0, 1, 2, // 삼각형 0
0, 2, 3}; // 삼각형 1
XMMATRIX XM_CALLCONV XMMatrixLookAtLH(FXMVECTOR EyePosition, FXMVECTOR FocusPosition, FXMVECTOR UpDirection);
XMMATRIX XM_CALLCONV XMMatrixLookAtRH(FXMVECTOR EyePosition, FXMVECTOR FocusPosition, FXMVECTOR UpDirection);
XMMATRIX XM_CALLCONV XMMatrixLookToLH(FXMVECTOR EyePosition, FXMVECTOR EyeDirection, FXMVECTOR UpDirection);
XMMATRIX XM_CALLCONV XMMatrixLookToRH(FXMVECTOR EyePosition, FXMVECTOR EyeDirection, FXMVECTOR UpDirection);
XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovLH(float FovAngleY, float AspectRatio, float NearZ, float FarZ);
XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovRH(float FovAngleY, float AspectRatio, float NearZ, float FarZ);
https://docs.microsoft.com/ko-kr/windows/uwp/graphics-concepts/hull-shader-stage--hs-
https://docs.microsoft.com/ko-kr/windows/uwp/graphics-concepts/domain-shader-stage--ds-
Backface Culling
08. Direct3D의 초기화 - CPU와 GPU의 상호작용 (0) | 2020.07.24 |
---|---|
08. Direct3D의 초기화 - 기본지식 2 (0) | 2020.07.24 |
09. 렌더링 파이프라인 1 (0) | 2020.07.14 |
08. Direct3D의 초기화 - 기본지식 1 (0) | 2020.07.13 |
20.07.01 일지 (0) | 2020.07.01 |
XMVECTOR XM_CALLCONV XMColorModulate(FXMVECTOR C1, FXMVECTOR C2);
struct XMCOLOR {
union {
struct {
uint8_t b;
uint8_t g;
uint8_t r;
uint8_t a;
};
uint32_t c;
};
void XMCOLOR();
void XMCOLOR(
const XMCOLOR &
);
XMCOLOR & operator=(
const XMCOLOR &
);
void XMCOLOR(
XMCOLOR &&
);
XMCOLOR & operator=(
XMCOLOR &&
);
XM_CONSTEXPR XMCOLOR(
uint32_t Color
);
void XMCOLOR(
float _r,
float _g,
float _b,
float _a
);
void XMCOLOR(
const float *pArray
);
void operator uint32_t();
XMCOLOR & operator=(
const uint32_t Color
);
};
XMVECTOR XM_CALLCONV XMLoadColor(
const XMCOLOR *pSource
);
void XM_CALLCONV XMStoreColor(
XMCOLOR *pDestination,
FXMVECTOR V
);
struct XMUINT4
{
uint32_t x;
uint32_t y;
uint32_t z;
uint32_t w;
XMUINT4() = default;
XMUINT4(const XMUINT4&) = default;
XMUINT4& operator=(const XMUINT4&) = default;
XMUINT4(XMUINT4&&) = default;
XMUINT4& operator=(XMUINT4&&) = default;
XM_CONSTEXPR XMUINT4(uint32_t _x, uint32_t _y, uint32_t _z, uint32_t _w) : x(_x), y(_y), z(_z), w(_w) {}
explicit XMUINT4(_In_reads_(4) const uint32_t *pArray) : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {}
};
XMVECTOR XM_CALLCONV XMLoadUInt4(_In_ const XMUINT4* pSource);
void XM_CALLCONV XMStoreUInt4(_Out_ XMUINT4* pDestination, _In_ FXMVECTOR V);
08. Direct3D의 초기화 - 기본지식 2 (0) | 2020.07.24 |
---|---|
09. 렌더링 파이프라인 2 (1) | 2020.07.14 |
08. Direct3D의 초기화 - 기본지식 1 (0) | 2020.07.13 |
20.07.01 일지 (0) | 2020.07.01 |
07. DirectX12 template 프로젝트 분석 06(完) - 20.06.26 (0) | 2020.06.26 |
몇일 휴식기를 가지다 보니 집중력과 체력이 부족해 코드를 짜지는 못했습니다.
대신 간단한 수도 코드를 짜놓았고, 내일 이를 구현하고자 합니다.
#sort ascendent price, descendent weight
if weight < need
if price > iter.price
before = price = iter.price
else
if before == iter.price
price += iter.price
else
#price is always same or bigger than before.
before = price = iter.price
else
if price > iter.price && before != iter.price
before = price = iter.price
weight += iter.price
20.17.16 개발일지 - 정육점(fin) (0) | 2020.07.16 |
---|---|
20.07.15 개발일지 - 정육점(fail) (0) | 2020.07.15 |
20.06.28 개발일지 - 정육점(실패) (0) | 2020.06.29 |
20.06.27 개발일지 - 謎紛芥索紀 (Large) (0) | 2020.06.27 |
20.06.27 개발일지 - Pizza Boxes (0) | 2020.06.27 |