[C++] 코딩테스트에서의 스택
·
카테고리 없음
1스택의 특징과 LIFO 원리 스택(Stack)은 가장 최근에 삽입한 원소가 가장 먼저 나오는 LIFO(Last In First Out) 구조의 자료구조다. 데이터를 쌓아 올리는 접시 더미처럼, 꺼낼 때는 맨 위부터 꺼낸다. 코딩테스트에서 스택이 등장하는 패턴은 대부분 "가장 최근에 넣은 원소"를 즉시 참조하거나 제거해야 하는 상황이다. 괄호 검증, 단조 스택(Monotone Stack), 함수 콜스택 시뮬레이션 등이 대표적이다. 구조설명대표 자료구조 LIFO 마지막에 넣은 원소가 먼저 나옴 Stack FIFO 먼저 넣은 원소가..
[C++] 코딩테스트에서의 시뮬레이션
·
프로그래밍/코드카타
1개요 시뮬레이션은 문제에서 제시한 규칙을 코드로 그대로 옮겨 구현하는 유형이다. 별도의 알고리즘 공식보다는 조건과 흐름을 정확히 파악하고 실수 없이 구현하는 능력이 핵심이다. 이번 챕터에서는 2차원 배열 기반의 좌표 연산, 대칭·회전 변환, 대각선 순회, 행렬 연산을 다룬다. 모두 코딩 테스트에서 반복적으로 출제되는 핵심 패턴이다. 2y, x 좌표 표현하기 코딩 테스트에서 2차원 평면은 2차원 배열로 표현하는 것이 가장 직관적이다. 이때 y좌표 → 행(row) 인덱스, x좌표 → 열(col) 인덱스로 대응시킨다. 예를 들어, 좌표 (3, 4)는 배열의 arr[4][3]에 해당한다. 수학 좌표계와 배열 인덱스의 y축 방향..
[C++] 코딩테스트에서의 정렬
·
프로그래밍/코드카타
1개요 정렬은 사용자가 정의한 순서대로 데이터를 나열하는 연산이다. 오름차순·내림차순이 일반적이지만, 임의 조건도 가능하다. 정렬이 필요한 이유는 크게 두 가지다. 첫째, 데이터가 정렬되어 있으면 중앙값·최댓값을 훨씬 빠르게 구할 수 있다. 둘째, 이진 탐색처럼 정렬을 전제 조건으로 삼는 알고리즘이 존재한다. 이번 챕터에서는 삽입 정렬, 병합 정렬, 계수 정렬, 힙 정렬 네 가지를 다룬다. 각 알고리즘의 동작 원리와 시간 복잡도를 비교하며 어떤 상황에 무엇을 써야 하는지 판단 기준을 세우는 것이 목표다. 2삽입 정렬 (Insertion Sort) 정렬되지 않은 원소를 이미 정렬된 부분 배열의 적절한 위치에 삽입하며 전..
[C++] 코딩테스트에서의 배열
·
프로그래밍/코드카타
1개요 배열은 동일한 타입의 원소들을 연속된 메모리 공간에 저장하는 가장 기본적인 자료구조다. 인덱스로 O(1) 접근이 가능하지만, 삽입 위치에 따라 시간 복잡도가 크게 달라진다. 맨 뒤 삽입은 O(1)이지만 맨 앞 삽입은 O(N)이 된다. 이 차이를 이해하면 어떤 자료구조를 선택해야 할지 판단하는 기준이 생긴다. 2배열의 세 가지 특징 1 동질성: 배열의 모든 원소는 동일한 타입이어야 한다. 정수형 배열이면 모든 원소가 int, 문자형 배열이면 모든 원소가 char다. 2 연속된 메모리 할당: 원소들이 메모리상에 연속적으로 배치된다. 단편화 문제가 적고, CPU 캐시를 효율적으로 활용할 수 있어 접근 속도가 빠르다. ..
[C++] 재귀 함수를 코드로
·
프로그래밍/코드카타
1이번 챕터의 핵심 메시지재귀는 자기 자신을 호출하는 함수로, 올바르게 설계하지 않으면 스택 오버플로우가 발생한다. 핵심은 단 두 가지 — 기저 조건(Base Case)과 재귀 호출 단계(Recursive Step)를 명확히 정의하는 것이다. 이 두 가지가 갖춰지면 팩토리얼, DFS, 분할 정복까지 재귀로 자연스럽게 표현할 수 있다.2재귀의 정의와 두 가지 요건재귀 함수를 구현하려면 반드시 아래 두 가지를 설계해야 한다. 하나라도 빠지면 무한 루프나 스택 오버플로우로 이어진다.① 재귀 호출 단계문제 크기 축소자기 자신을 호출하되, 매번 문제의 크기를 줄여야 한다. 크기가 줄지 않으면 무한 호출로 이어진다.② 기저 조건 (Base Case)종료 조건특정 조건을 만족하면 자기 자신을 더 이상 호출하지 않고 ..
[C++] 입출력 데이터 다루기 - 숫자 연산과 문자열 스트림 정리
·
프로그래밍/코드카타
1. 이번 챕터에서 배운 것코딩 테스트 문제를 풀다 보면 입력값을 파싱하고 변환하는 데 생각보다 많은 시간을 쓰게 된다. 이번 강의에서는 C++에서 자주 쓰이는 숫자 처리 함수 3가지와, 문자열을 스트림처럼 다루는 stringstream 활용법을 집중적으로 다뤘다.모든 수학 함수(round, ceil, floor)는 #include 헤더가 필요하고, 문자열 스트림 관련 기능은 #include 이 필요하다.2. 숫자 다루기 — cmath 함수 3종함수동작양수 예음수 예round(x)반올림 (0.5는 0에서 먼 쪽)round(3.5) → 4round(-2.5) → -3ceil(x)올림ceil(3.2) → 4ceil(-3.2) → -3floor(x)내림floor(3.7) → 3floor(-3.7) → -4주..
[코딩 테스트] 어떻게 준비하고 어떻게 풀어야 할까?
·
프로그래밍/코드카타
1. 코딩 테스트란 무엇인가코딩 테스트는 제한된 시간 안에 프로그래밍 언어로 주어진 문제를 풀어내는 시험이다. 많은 IT 기업의 채용 프로세스에 포함되어 있으며, 단순히 정답을 맞히는 것을 넘어 문제에서 요구하는 성능을 충족하는 코드를 구현하는 것이 핵심이다.흔히 "머리가 좋아야 풀 수 있다"고 생각하지만, 코딩 테스트는 IQ 테스트가 아니다. 시험에서 요구하는 사항을 명확히 인지하고 반복 트레이닝한다면 충분히 통과할 수 있는 시험이다.프로그래머스 기준으로 취업을 목표로 한다면 레벨 2 ~ 3 수준을 목표로 삼는 것이 적절하다.2. 나의 현재 수준 파악하기레벨 0~1: 기본 문법은 숙지했으나 자료구조·알고리즘을 모름. 직관과 단순 논리로 문제 해결.레벨 1~2: 자료구조·알고리즘을 배우는 중. 간단한 자..
[UnrealEngine] 멀티플레이어 디펜스 `SagoMagic` 프로젝트 KPT 회고
·
프로그래밍/개발일지
프로젝트 개요프로젝트명SagoMagic (Co-op 탑다운 타워디펜스)엔진Unreal Engine 5.6, C++ / Blueprint네트워크Dedicated Server, Seamless Travel핵심 기술GAS, GMS, 그리드 건축, 격자형 인벤토리, Fragment 패턴팀 규모7인 ( 곽은서, 김현, 박원종, 이준로, 임영택, 주철민, 허태린 )개발 기간4 / 1 ~ 4 / 24게임 루프는 로비 → 정비 단계(BuildState) → 웨이브 전투(CombatState) → 결과 화면(ResultState)의 사이클을 반복하며 베이스캠프(ASMBaseCampActor)의 HP가 0이 되면 패배, 마지막 웨이브를 클리어하면 승리한다.4인 Dedicated Server 구조로 운영되며 맵 전환은 Se..
[Unreal Engine5] GA_SkillBase 리팩토링 회고 — 애니메이션 추가와 GameplayCue owner 복제 이슈
·
프로그래밍/Unreal Engine 5
프로토타입 단계에서 급히 쌓인 스킬 GA들에 애니메이션을 입히려다 보니, 각 GA가 같은 네트워크 보일러플레이트를 따로따로 들고 있고 그 안에 LocalPredicted 특유의 함정까지 숨어 있었다. 이번 글에서는 (1) 왜 리팩토링이 필요했는지, (2) 어떤 구조로 통합했는지, 그리고 (3) 리팩토링 과정에서 드러난 GameplayCue owner-skip 버그를 어떻게 해결했는지 세 가지를 정리한다.1. 리팩토링 전 구조공통 문제 (보일러플레이트의 출처)스킬마다 "로컬 마우스 좌표 → ServerSetReplicatedTargetData → 서버 AbilityTargetDataSetDelegate 바인딩 → CallReplicatedTargetDataDelegatesIfSet → 콜백에서 종료" 루틴..
[Unreal Engine5] GAS의 GameplayEffectContextHandle과 GameplayEffectSpecHandle
·
프로그래밍/Unreal Engine 5
계기SMASkillProjectile에서 투사체가 적에게 맞았을 때 데미지를 적용하는 코드를 작성하다가 두 핸들의 역할이 헷갈렸다.FGameplayEffectContextHandle ContextHandle = SourceASC->MakeEffectContext();ContextHandle.AddInstigator(Avatar, Controller);FGameplayEffectSpecHandle SpecHandle = SourceASC->MakeOutgoingSpec(DamageEffectClass, 1.f, ContextHandle);SpecHandle.Data->SetSetByCallerMagnitude(SMSkillTag::Data_Damage_Amount, -BaseDamage);TargetASC..