프로그래머스 - 뒤에 있는 큰 수 찾기
문제 분석
배열의 각 원소들에 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 크면서 가장 가까이 있는 수가 뒷 큰수
모든 원소에 대한 뒷 큰수를 차례로 담은 배열
stack으로 담으면서 비교?
stack top보다 크면 stack에 있는 것을 빼내고 정답 배열에 작성
작다면 stack에 값과 인덱스를 같이 넣어버리기
순회 끝났을 때 남아있다면 해당 index들에 -1넣기
풀이 코드
#include <string>
#include <vector>
#include <stack>
using namespace std;
vector<int> solution(vector<int> numbers) {
vector<int> answer(numbers.size(), -1);
stack<pair<int,int>> st;
for(int i = 0; i< numbers.size(); i++)
{
while(!st.empty())
{
pair<int,int> top = st.top();
if(top.first < numbers[i])
{
st.pop();
answer[top.second] = numbers[i];
}
else
{
break;
}
}
st.push(make_pair(numbers[i],i));
}
return answer;
}
Claude Code는 Anthropic에서 만든 AI 에이전트 코딩 도구
터미널에서 자연어로 지시하면 코드를 작성, 파일을 수정, 명령어를 실행, Git까지 알아서 처리합니다.
단순 코드 자동완성이 아니라, 프로젝트 전체를 이해하고 스스로 판단해서 작업하는 에이전트에 가깝습니다.
MCP
외부의 자료를 읽어와야 할 때 그 외부와 통신을 가능하게 만들어주는 통신 프로토콜입니다.
터미널이나 VS Code 같은 IDE에 연결해서 사용하는 것이 추천됩니다.
주요 기능
기본 기능(개발자에게 필수적인 것이 가능합니다.)
Git 통합
에이전트 기능
확장성
MCP(Model Context Protocol) - 언리얼 에디터, Python 스크립트 등 외부 도구 연동
CLAUDE.md - 프로젝트 루트에 놓으면 매 세션마다 UE5 프로젝트 컨텍스트를 자동 로드
메모리 - 작업하면서 자동으로 기억을 기록하고 다음 세션에 활용
사용 가능한 모델(사고 중추)
Opus 4.6 - 가끔 과할 때가 있음
Sonnet 4.6 -기본 모델, 일반적인 개발 작업 전반에 추천
Haiku 45 - 가장 빠르고 가벼움
Claude Code는 유료부터 사용가능
Pro 월 20달러
Max 5x 100달러 사용량 5배
Max 20x 사용량 20배
가격 높아진다고 성능이 높아지지는 않는다고 합니다.
요구사항을 구체적으로
계획 먼저 확인 후 진행
컴파일 에러를 그대로 붙여넣기
하나씩 단계적으로 기능 추가
변경 후 바로 커밋
AI 작업 + 사람 검증 시대
현대 개발 환경에서는 AI가 코드 문서 설계의 1차 작업을 수행하고, 사람이 전체 구조를 설계하고 결과를 검증하는 방식이 주류가 되고 있습니다.
AI는 빠르게 결과를 만들지만 실수를 하기 때문에 여러 AI를 병렬로 돌려 교차 검증하는 것이 유용합니다.
추천 검증 프로세스
1. AI 모델 A로 결과 생성
2. AI 모델 B, C를 이용해 검증
3. 사람이 마지막으로 전체 구조와 로직을 재확인
GBuffer - Depth Buffer와 Stencil Buffer를 묶어서 부르는 명칭이라고 합니다.
Depth는 카메라에 가까울 수록 작고, 멀수록 큽니다.
Scene Depth 노드
기존 ToonMaterial 처럼 unlit에서는 사용이 불가하니 RenderTarget을 사용해서 만들어 주어야 합니다.

컨탠츠 브라우저 우클릭 ->Texture -> RenderTarget으로 생성
텍스처 렌더 타깃(생성된 GBuffer)의 x, y 크기는 카메라 뷰와 같게 설정해야 합니다.
이 랜더 타깃에 색을 입히기 위해 SceneCaptureComponent 2D를 사용합니다.
Camera에 붙여 줍니다.
이 SceneCaptureComponent 2D에도 FOV가 존재하는데 반드시 Camera의 것과 동일하게 유지해야 합니다.
FOV만 아니라 Camera 관련 옵션은 Camera와 일치시켜야 합니다.
이벤트 핸들러나 Tick에 일치 시키는 로직을 포함시켜야 합니다.
SceneCapture에 생성했던 GBuffer를 등록시킵니다.
Depth를 기록하고 싶다면 Capture Source를 SceneDepth in R로 지정합니다. Depth를 R채널에 저장해 줍니다
보통 선형적(0~1)으로 저장되어야 하나, Unreal에서는 선형적이지 않게 저장됩니다.
Depth를 이용한 RimLight는 Normal 방향으로 살짝 위동한 위치에서의 Depth와 기존 위치의 Depth가 클 경우 이를 외각선으로 인식하는 것을 이용합니다.
머티리얼 함수 생성
머티리얼 함수는 특정 기능을 담당하는 노드들을 별개의 함수로 분리한 것입니다.
한 머티리얼 내부에 모든 노드를 넣는 것은 유지보수에 매우 나쁠 것이니 함수로 분리해줄 필요가 있습니다.

콘텐츠 브라우저 우클릭 -> 머티리얼 -> 고급 -> 머티리얼 함수를 선택해서 생성할 수 있습니다.
머티리얼 에디터에서 함수를 검색할 수 있게 Detail에서 라이브러리에 노출을 체크해두어야 합니다
기본값은 노드를 연결해서 지정해 줄 수 있습니다.
FunctionInput 노드를 통해 매개변수를 설정할 수 있습니다.
타입은 FuctionInput 노드의 디테일에서 입력 타입을 통해 지정할 수 있습니다.
중요! TextureCoordinate != GBuffer UV
TextureCoordinate는 매쉬에 따로 펴진 UV의 좌표입니다.
하지만 GBuffer에 저장되는 UV는 화면의 것(ScreenUV)이기에 매쉬에서 가져오는 것은 불가능합니다.
WorldPosition에서 ClipSpace로 변경해주어야 합니다.
TransformPosition노드는 ClipSpace(ScreenSpace)로의 변환을 지원하지 않으니
WorldPosition에서 ViewSpace(CameraSpace)까지만 변경이 됩니다.
ViewSpace에서 CamreaSpace로의 변환은 CustomNode에 코드를 넣어서 진행해 주어야 합니다.
return mul(float4(PositionWS.xyz,1),LWCToFloat(ResolvedView.WorldToClip));
ResolvedView.WorldToClip : World→ClipSpace 변환 행렬을 반환합니다. 엔진에 내장된 함수LWCToFloat : LWCT형태의 자료형을 Float형 자료형으로 변경하는 함수입니다.LWCT는 Larget World Coordinate Transformation의 약자입니다.
LWCT - 월드 좌표가 수백 킬로가 돼버리면 생기는 오차를 잡아주는 자료형입니다.
좌표 변환 흐름을 정리해보자면
World → View(Camera) → Clip → NDC(w로 나눔) → ScreenUV
가 됩니다.
View(Camera) Space: 카메라가 원점(0,0,0)이고, 카메라 기준으로 물체가 어디 있는지
Clip Space: 거기에 원근/직교 투영을 적용한 4D 좌표 (x,y,z,w)
NDC: clip.xyz / clip.w 한 뒤 범위가 보통 [-1,1]
ScreenUV: NDC를 [0,1]로 리맵한 화면 좌표
그래서 ResolvedView.WorldToClip을 곱하면 Camera Space가 아니라 Clip Space가 나옵니다.
ClipSpace에서 x, y만 추출한 뒤 정규화를 하기 위해 a로 나누어줍니다.
원근 변화(z 나누기) 공식을 참고합니다. 멀티리얼을 만들기 전에 노션 참조할 것
해당 공식에서 z는 깊이값인데 이 깊이값이 w에 저장되어 나중에 정규화를 하려면 w를 나눠주면 된다는 공식이었던 것 같은데
나중에 복습이 필요한 것 같습니다.
uv를 구하는데 ClipSpace의 z는 필요가 없다고 합니다. z나누기 공식에서 말하는 z값 == 깊이 값은 A 채널(w)에 저장이 됩니다.
때문에 Alpha 채널 값으로 나누어주면 정규화가 됩니다.
ClipSpace 행렬변환을 하고 나면 우리가 기록하고 있던 z 값(깊이 값)이 w로 옮겨지고 z는 다른 값이 계산이 됩니다.
z값 그러니까 깊이 값을 보존하기 위해서 따로 빼두는 겁니다. 깊이 값은 나중에 정규화를 하기 위해 필요한 중요한 값이니까요.
DitheremporalAA
Unreal Engine의 TAA(Temporal Anti-Aliasing)가 프레임을 누적해 부드럽게 만드는 성질을 전제로 해서, 디더(점무늬) 패턴으로 픽셀을 일부만 보이게 만든 결과를 시간축으로 섞이게 유도하는 노드라고 합니다. 옮겨 적으면서도 뭔 말인지 이해가 잘 안되네요,
주로 Masked 머티리얼에서 사용하며 Translucent처럼 부드러운 페이드(사라짐/나타남)나 얇은 반투명 느낌을 ‘대체’**하는 용도로 많이 사용한다고 합니다. 원리상 화면에 점무늬/구멍이 뚫린 듯한 느낌이 날 수 있고, 움직임이나 카메라 상황에 따라 지저분해 보이거나 깔끔하지 않을 수 있기에 퀄리티가 떨어져도 무방할 때 사용을 고려할만한 노드입니다.
Translucent의 비용이 무겁기 때문에 사용하는 대체 방안 중 하나입니다.
굴절효과는 비용이 무겁기에 모바일 같이 저사양의 경우 프레넬을 사용해 굴절효과를 구현하기도 합니다.
레퍼런스를 Unity 걸로 찾았을 때 y축을 사용한다고 나오면 우리는 z축을 사용해야 합니다. up vector가 다릅니다. 좌표계가 달라서요.