260126 TIL - 언리얼 C++ 13일차

2026. 1. 26. 21:04언리얼 7기 본캠프

코드카타 풀다가 약간 당황스러운(?) 일이 있었는데, 코테사이트를 처음 접하고 둘러보면서 풀었던 문제가 나왔던 것임. 이게 2레벨인줄도 몰랐고 지금 할만한건지도 몰랐는데... 근데 지금보니까 로직이 비효율적인걸 발견해서 좀 더 개선해서 다시 풀어보는 기회도 가졌음. 예전에 쓴 코드를 다시 보면 '내가 이걸 무슨 생각으로 썼지?' 라는 일이 일어난다곤 하던데, 실제로 그걸 경험하니까 좀 놀라고 신선했음

 

//이전에 풀었던 코드. 대진표에 홀수짝수를 계속 따져가며 하나하나 계산해서, 로직은 맞는데 식이 좀 엉성함
#include <iostream>

using namespace std;

int solution(int n, int a, int b)
{
    int answer = 0;
    while(true){
        answer++;
        if ((a-b==1&&a%2==0)||(b-a==1&&b%2==0)){
            break;
        }
        if (a%2 == 1){
            a = a/2+1;
        } else if (a!=1){
            a /= 2;
        }
        if (b%2 == 1){
            b = b/2+1;
        } else if (b!=1) {
            b /= 2;
        }
    }

    return answer;
}

//개선한 코드. int의 특성상 소숫점은 버려지기에 결국 1을 더하고 2로 나누면 라운드 숫자의 안정된 값이 나옴
//그래서 결국 두 수가 같아질때까지 반복하면 원하는 수를 구할 수 있었음

#include <iostream>

using namespace std;

int solution(int n, int a, int b)
{
    int answer = 0;
    while(a != b){
        a = (a + 1) / 2;
        b = (b + 1) / 2;
        answer++;
    }

    return answer;
}

//카펫 코드. 연산 횟수를 줄이기 위해 i * i를 쓰는게 아직 적응이 좀 덜됨...
//멍청하게 넓이 기준으로 사각형 변 구하는법을 까먹어서 검색까지함 ^^;
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(int brown, int yellow) {
    vector<int> answer;
    int total = brown + yellow;
    int width, height;
    for(int i = 3; i * i <= total; i++){
        if(total % i == 0){
            int tempw = i;
            int temph = total / i;
            if((tempw-2) * (temph-2) == yellow){
                width = tempw;
                height = temph;
                break;
            }
        }
    }
    // 지금 보니까 그냥 i가 작은수부터니까 i를 height로 두면 min max 안써도 됐을듯?
    answer = {max(width, height), min(width, height)};
    return answer;
    
    
//최소공배수 문제. numeric 헤더의 lcm 함수를 쓰는게 편하겠지만, 최대공약수(gcd)를 구해서 최소공배수를 구하는
//유클리드 호제법이라는걸 배워서 작성해봤음
#include <string>
#include <vector>

using namespace std;

int solution(vector<int> arr) {
    int answer = 0;
    int a = arr[0];
    int gcd;
    for(int i = 1; i < arr.size(); i++){
        int b = arr[i];
        int tempa = a;
        int tempb = b;
        while(true){
            int r = tempa % tempb;
            if(r == 0){
                gcd = tempb;
                break;
            }
            else{
                tempa = tempb;
                tempb = r;
            }
        }
        a = (a / gcd) * b;
    }
    answer = a;
    return answer;
}

//물론 numeric 쓰면 이렇게 짧아짐. 이게 더 직관적인거같기도 하고...
#include <string>
#include <vector>
#include <numeric>

using namespace std;

int solution(vector<int> arr) {
    int answer = 0;
    int a = arr[0];
    for(int i = 1; i < arr.size(); i++){
        int b = arr[i];
        a = lcm(a,b);
    }
    answer = a;
    return answer;
}
}

 

오늘은 챌린지반 강의가 진행됐고, 기존 강의는 일단 3-4강 듣고 챌린지반 강의에 집중했음

GAS의 기본?인 Attribute Set에 대한 내용이었음. 캐릭터에 사용할 다양한 수치들을 관리하는 요소인데, 강의를 들으면서 보니까 이 방식을 사용하면 직접 구현해서 관리하는것에 비해 어느정도 자동으로 편하게 구현이 되면서도 확장성과 유연성이 좋게 만들 수 있을것 같다고 느낌. 가장 큰 장점은 자동 네트워크 복제 라고 하는데, 아직 언리얼에서의 네트워크에 대한 개념이 확실히 잡히지는 않아서 좀 미묘했음

 

그래서 강의를 보며 튜터님이 쓰시는걸 같이 구현해보려고 했는데... 어제 밤새서 집중 안됨 + 강의 속도가 무진장 빠름 문제로 결국 중간에 놓친게 많아서 컴파일에러가 왕창 나서 자료랑 다시보기를 통해 복습하며 구현했음...

 

그래도 나름대로 구현이 잘 되었다

 

 

챌린지반 공부를 하면서 메인공부 따라갈려면 아무래도 시간이 촉박할것 같으니 내일부터 제대로 마음을 다잡고 강의 진도를 빠르게 빼고 과제와 챌린지반 공부에 좀 더 집중을 해야할 것 같음

 

전문용어가 나올때마다 머리가 띵해지지만 그래도 아직까지 완전히 못따라갈 수준의 수업은 아니어서 어떻게든 따라붙어보려고 노력중