문제 설명 A와 B가 n개의 주사위를 가지고 승부를 합니다. 주사위의 6개 면에 각각 하나의 수가 쓰여 있으며, 주사위를 던졌을 때 각 면이 나올 확률은 동일합니다. 각 주사위는 1 ~ n의 번호를 가지고 있으며, 주사위에 쓰인 수의 구성은 모두 다릅니다. A가 먼저 n / 2개의 주사위를 가져가면 B가 남은 n / 2개의 주사위를 가져갑니다. 각각 가져간 주사위를 모두 굴린 뒤, 나온 수들을 모두 합해 점수를 계산합니다. 점수가 더 큰 쪽이 승리하며, 점수가 같다면 무승부입니다. A는 자신이 승리할 확률이 가장 높아지도록 주사위를 가져가려 합니다. 다음은 n = 4인 예시입니다. 주사위 구성 구성 #1 [1, 2, 3, 4, 5, 6] #2 [3, 3, 3, 3, 4, 4] #3 [1, 3, 3, 4,..
분류 전체보기
인게임 Mesh 변경 프로젝트에서 Item의 Mesh를 동적으로 바꿔야 하는 상황이었다. 에디터에서 플레이할 때는 올바르게 동작하여 그냥 넘어갔었다. 근데, standalone으로 게임을 돌렸을 때, Mesh가 제대로 변경되지 않고 Default Mesh로 고정되어 있었다. 하지만, 특정 Item들만 Mesh가 변경되지 않았고 제대로 변경된 Item들도 있었다. 분석해 보니 Mesh 세팅의 차이가 있었다. Mesh가 변경되지 않는 Item들은 환경 요소로 사용하고 있는 Item들이다. 예를 들면, 채집 가능한 맵에 자라나는 열매나 꽃 같은 것들이 이에 해당한다. 따라서, 이들은 생성된 위치에 고정되어 움직이지 않기를 원했기 때문에 Mesh의 모빌리티를 스태틱으로 설정했었다. 이 부분이 문제가 되어 Mes..
BeginPlay 프로젝트 중 상호작용 가능한 Actor에 WidgetComponent를 넣어 놨는데 해당 위젯이 보이지 않는 현상이 발견되어 많은 시간을 고민했다. 기존에도 했던 방식인데 다른 Actor에서는 동일한 Widget을 써도 올바르게 동작하고 Root로 설정한 Mesh의 scale 문제인지도 체크해 봤다. 계속 찾아보다 다른 점 하나를 발견했다. 다른 점은 BeginPlay에서 Super의 BeginPlay를 호출하지 않은 것이었다. Super인 AActor의 BeginPlay에서는 Component를 초기화하는 부분이 있다. //... for (UActorComponent* Component : Components) { // bHasBegunPlay will be true for the c..
상속과 인터페이스 상속과 인터페이스의 공통점은 다형성이다. 상속은 자주 사용하지만 인터페이스는 자주 사용하지 않았다. 프로젝트를 진행하던 중 적절한 사용상황을 발견하여 기록한다. 프로젝트 중, NPC와 Drop Item 모두 캐릭터와 상호작용하는 경우가 있다. NPC는 대화를 통해 퀘스트를 주고, Drop Item은 Inventory에 Item을 추가한다. 둘 다, 상호작용하는 Actor이기 때문에 하나의 부모를 가지고 Interact 함수를 구현한 뒤 상속받게 하였다. 하지만, NPC를 구현하다 문제가 발생했다. 올바르게 동작하지만, 원하지 않는 상속이 이루어지게 되는 문제였다. 예를 들어, 부모 클래스인 InteractiveActor에서 Item에 관한 정보를 가지고 있다고 가정했을 때, NPC는 I..
Slate Slate란 Unreal Editor 또는 게임 내 사용자 인터페이스와 같은 도구 및 응용 프로그램용 사용자 인터페이스를 효율적으로 구축하도록 설계된 플랫폼에 구애받지 않는 맞춤형 사용자 인터페이스 프레임워크이다. 즉, UI를 만들 수 있는 프레임워크라고 생각하면 된다. 에디터에 있는 UI들도 만들 수 있지만, 인게임에 사용되는 UI도 생성가능하다. 하지만, 인게임 UI는 UMG를 통해 만드는 게 효율적이다. UMG도 계속 부모를 타고가다보면 Slate를 이용하여 구현하였다. 예시 UButton의 클릭 처리를 할 때, OnClicked에 함수를 바인딩하여 사용한다. MyButton->OnClicked.AddDynamic(this, &MyClass::MyOnClick); Button클래스를 뜯어..
UserWidget의 Native UserWidget을 상속하여 UMG작업을 하면 Native~~라는 함수를 자주 사용한다. 하지만, UserWidget에는 Native가 없는 함수들도 존재한다. 예를 들면, UserWidget에는 NativeOnMouseButtonDown라는 함수도 존재하고 OnMouseButtonDown라는 함수도 존재한다. 이 두 함수의 차이점을 알고 싶어 자세히 살펴보니 NativeOnMouseButtonDown에서 OnMouseButtonDown를 호출하는 것을 알 수 있었다. 그렇다면 NativeOnMouseButtonDown가 존재하는 이유가 무엇인지 알아보려 글을 쓴다. Native 위에서 언급한 두 함수의 차이는 Native의 여부이다. 따라서, Native에 대해 알아..
문제 설명 지도개발팀에서 근무하는 제이지는 지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물들을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다. 이 프로그램의 테스팅 업무를 담당하고 있는 어피치는 서비스를 오픈하기 전 각 로직에 대한 성능 측정을 수행하였는데, 제이지가 작성한 부분 중 데이터베이스에서 게시물을 가져오는 부분의 실행시간이 너무 오래 걸린다는 것을 알게 되었다. 어피치는 제이지에게 해당 로직을 개선하라고 닦달하기 시작하였고, 제이지는 DB 캐시를 적용하여 성능 개선을 시도하고 있지만 캐시 크기를 얼마로 해야 효율적인지 몰라 난감한 상황이다. 어피치에게 시달리는 제이지를 도와, DB 캐시를 적용할 때 캐시 크기에 따른 실행시간 측정 프로그램을 작성하시오. 캐시 교체 알고리즘..
문제 설명 신입사원 어피치는 카카오톡으로 전송되는 메시지를 압축하여 전송 효율을 높이는 업무를 맡게 되었다. 메시지를 압축하더라도 전달되는 정보가 바뀌어서는 안 되므로, 압축 전의 정보를 완벽하게 복원 가능한 무손실 압축 알고리즘을 구현하기로 했다. 어피치는 여러 압축 알고리즘 중에서 성능이 좋고 구현이 간단한 LZW(Lempel–Ziv–Welch) 압축을 구현하기로 했다. LZW 압축은 1983년 발표된 알고리즘으로, 이미지 파일 포맷인 GIF 등 다양한 응용에서 사용되었다. LZW 압축은 다음 과정을 거친다. 길이가 1인 모든 단어를 포함하도록 사전을 초기화한다. 사전에서 현재 입력과 일치하는 가장 긴 문자열 w를 찾는다. w에 해당하는 사전의 색인 번호를 출력하고, 입력에서 w를 제거한다. 입력에서..
문제 설명 정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요. 제한 사항 n은 1 이상 1,000 이하입니다. 풀이 처음 문제를 보고서는 규칙이 있을지 찾아보았다. 근데 규칙을 찾을 수 없었다. 그래서 생각한 방법은 2차원 배열에 삼각 달팽이를 그린 뒤, 정답 배열에 옮기는 것이다. 삼각 달팽이를 그리는 방법은 달팽이를 그리는 것과 비슷한다. 즉, dy, dx를 이용하여 한 칸씩 이동하며 숫자를 증가시키면 된다. 이때, dy, dx가 4방향이 아닌 3방향으로 정하는 것이다. vector dy..
문제 설명 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램의 과거 버전을 모두 담고 있어, 이름 순으로 정렬된 파일 목록은 보기가 불편했다. 파일을 이름 순으로 정렬하면 나중에 만들어진 ver-10.zip이 ver-9.zip보다 먼저 표시되기 때문이다. 버전 번호 외에도 숫자가 포함된 파일 목록은 여러 면에서 관리하기 불편했다. 예컨대 파일 목록이 ["img12.png", "img10.png", "img2.png", "img1.png"]일 경우, 일반적인 정렬은 ["img1.png", "img10.png", "img12.png", "img2.png"] 순이 되지만, 숫자 순으로 정렬..