260501 TIL - 챕터5 1주차

2026. 5. 1. 20:56언리얼 7기 본캠프

컨디션 관리를 잘 했어야 하는데 챕터4 팀프로젝트에 너무 많은 전력을 쏟아낸 나머지 일주일동안 거의 죽은듯이 뭘 하질 못해서 TIL로 적을 내용도 별로 없었음. 심신을 다잡고 다시 적어보려고 함

 

//이중우선순위큐 문제. multiset을 쓰는 방법과 실제로 priority queue 두개를 쓰는 방법이 있었는데
//각각 장단점이 있었기에 일단 그나마 익숙한 pq 2개를 사용하는 방식으로 풀어봄

#include <string>
#include <vector>
#include <queue>
#include <unordered_map>

using namespace std;

vector<int> solution(vector<string> operations) {
    priority_queue<int> maxpq;
    priority_queue<int, vector<int>, greater<int>> minpq;
    unordered_map<int, int> validcount;
    
    for(const string& s : operations)
    {
        char op = s[0];
        int num = stoi(s.substr(2));
        
        if (op == 'I')
        {
            maxpq.push(num);
            minpq.push(num);
            validcount[num]++;
        }
        else
        {
            if (num == 1)
            {
                while(!maxpq.empty() && validcount[maxpq.top()] == 0) maxpq.pop();
                if (!maxpq.empty())
                {
                    validcount[maxpq.top()]--;
                    maxpq.pop();
                }
            }
            else if (num == -1)
            {
                while(!minpq.empty() && validcount[minpq.top()] == 0) minpq.pop();
                if (!minpq.empty())
                {
                    validcount[minpq.top()]--;
                    minpq.pop();
                }
            }
        }
    }
    
    while(!maxpq.empty() && validcount[maxpq.top()] == 0) maxpq.pop();
    while(!minpq.empty() && validcount[minpq.top()] == 0) minpq.pop();
    if (maxpq.empty() && minpq.empty()) return {0, 0};
    else return {maxpq.top(), minpq.top()};
}

 

일주일간 CS 면접 질문들 중 일부

 

Q. SOLID 원칙 중 하나를 골라서, 자신이 이전에 했던 프로젝트에서 어떻게 적용했는지 설명

A. SOLID중 단일 책임 원칙(SRP)을 준수하려고 했었으며, C++로 만드는 텍스트 RPG 프로젝트에서 게임의 중추를 관리하는 GameManager과 상태 관리하는 StatusManager, 업적을 AchievementManager 등으로 분리해서, 각각이 오직 자신만의 책임을 지고 관리하게끔 만들었습니다

 

Q. 객체지향에서 is-a 와 has-a에 대한 설명, 그리고 프로젝트에서 이걸 어떻게 적용해서 해봤었는지 설명

A. is-a는 상속관계이며, 결합도가 높고 유연성이 낮지만 다형성을 이용해 하나의 포인터나 참조자로 여러 자식 객체를 관리할 수 있고, 공통된 기능을 부모에 적힌 코드 하나로 재사용할 수 있습니다. has-a는 포함관계이며, 유연성이 높고 결합도가 낮아 클래스마다 한가지 책임만 가지게 할 수 있지만, 포함된 객체가 많아지면 관리 복잡도가 늘어나며 생성 및 소멸에서 메모리 관리에 더 신경을 써야하는 단점이 있습니다

언리얼로 만든 협동 디펜스 게임에서, is-a로는 공통된 스킬 베이스 클래스 하나를 두고, 그 클래스를 상속받아 ActiveAbility나 EndAbility등의 공통된 부모 함수를 오버라이드해서 각자의 고유한 스킬을 만들 수 있게 적용시켜 봤습니다

has-a는 캐릭터에 붙여서 사용하는 다양한 컴포넌트를 캐릭터에 붙였고, 인벤토리 컴포넌트, 상호작용 컴포넌트등 다양한 컴포넌트를 붙여서 사용할 수 있었습니다