Unreal 개발 본 캠프 6일차

HappyCircle·2025년 12월 4일

Unreal 개발

목록 보기
23/163

오늘 학습 진행 내용
게임 개발자를 위한 C++ 문법
챕터 1-1. 프로그래밍 기초 (1)
세상에서 가장 간단한 프로그램
Hello, World 출력

#include <iostream>
using namespace std;

int main(){
    cout<<"Hello, World"<<endl;
    return 0;
}

이미 많은 기능이 라이브러리로 구현, 이걸 사용하기 위해서는 구현된 헤더 파일을 코드에 포함

#include <iostream>

C++ 표준 라이브러리의 입출력 기능을 제공하는 헤더 파일
#include를 사용하면 해당 헤더파일의
정의된 기능(cout, cin 같은 것들)을 사용할 수 있음

int main()
main함수는 C++ 프로그램이 실행될 때 가장 먼저 호출되는 함수
모든 프로그램은 반드시 main 함수가 있어야 함

cout <<"Hello, World!" <<endl;
프로그램을 실행시켰을 때 나오는 화면 콘솔
cout은 콘솔에 무언가 출력할 수 있게 해주는 명령어
cout을 통해 콘솔에 "Hello, World!"를 출력하는 명령어
endl은 개행이라고 하고, Hello, World를 출력하고 엔터 입력한 것과 동일
return 0;
프로그램이 정상적으로 종료되었음을 운영체제에 알리는 역할

변수의 선언

#include <iostream>
#include <string> //string 헤더를 추가
using namespace std;

int main() {
    // 정수형 변수 선언
    int age = 25;  // 초기값 25
    int year;      // 초기값 없음

    // 실수형 변수 선언
    float pi = 3.14f;
    double largeDecimal = 12345.6789;

    // 문자형 변수 선언
    char grade = 'A';

    // 문자열 변수 (C++ 표준 라이브러리 사용)
    string name = "John";

    // 불리언 변수
    bool isStudent = true;

    cout << "Age: " << age << endl;
    cout << "Year: " << year << " (uninitialized, may contain garbage value)" << endl;
    cout << "Pi: " << pi << endl;
    cout << "Large Decimal: " << largeDecimal << endl;
    cout << "Grade: " << grade << endl;
    cout << "Name: " << name << endl;
    cout << "Is Student: " << (isStudent ? "true" : "false") << endl;

    // 상수 선언
    const double gravity = 9.8;  // 중력 가속도
    cout << "Gravity: " << gravity << endl;

    return 0;
}

변수의 연산

#include <iostream>
using namespace std;

int main() {
    // 변수 선언 및 초기화
    int a = 10, b = 5;
    float x = 15.5, y = 4.2;

    // 산술 연산
    cout << "산술 연산:" << endl;
    cout << "a + b = " << a + b << endl; // 덧셈
    cout << "a - b = " << a - b << endl; // 뺄셈
    cout << "a * b = " << a * b << endl; // 곱셈
    cout << "a / b = " << a / b << endl; // 나눗셈
    cout << "a % b = " << a % b << endl; // 나머지

    // 대입 연산
    cout << "\n대입 연산:" << endl;
    a += 3;  // a = a + 3
    cout << "a += 3 -> a = " << a << endl;
    a -= 2;  // a = a - 2
    cout << "a -= 2 -> a = " << a << endl;
    a *= 2;  // a = a * 2
    cout << "a *= 2 -> a = " << a << endl;
    a /= 2;  // a = a / 2
    cout << "a /= 2 -> a = " << a << endl;

    // 관계 연산
    cout << "\n관계 연산:" << endl;
    cout << "a == b: " << (a == b) << endl; // 같음
    cout << "a != b: " << (a != b) << endl; // 다름
    cout << "a > b: " << (a > b) << endl;   // 큼
    cout << "a < b: " << (a < b) << endl;   // 작음
    cout << "a >= b: " << (a >= b) << endl; // 크거나 같음
    cout << "a <= b: " << (a <= b) << endl; // 작거나 같음

    return 0;
}

일반 변수와 unsigned가 붙은 변수의 차이

// 일반 변수(signed int)와 unsigned int의 차이 예제
#include <iostream>

using namespace std;

int main() {
    int signedVar = -10;      // 일반 int (signed), 음수 가능
    unsigned int unsignedVar = 10; // unsigned int, 음수 불가능

    cout << "signed int: " << signedVar << endl;
    cout << "unsigned int: " << unsignedVar << endl;

    return 0;
}

/*
출력 예시:
signed int: -10
unsigned int: 10
*/
타입표현하는 데이터설명
int정수(양수, 0, 음수)소수점 없음
float, double부동 소수소수점 있음, 둘은 정밀도 차이
char단일 문자작은 따옴표로 한 문자 표현
bool논리값true, false
string문자열쌍따옴표로 문자열 표현, <string> 헤더 필요
unsigned양수음수 입력 불가, 양수 범위 약 2배

계산기 구현 해보기

#include <iostream>

using namespace std;

int main()
{
    // 1. 입력 받은 숫자를 저장 할 2개의 변수를 선언
    int firstNum = 0;
    int secondNum = 0;

    cout << "첫 번째 수 입력 : ";
    cin >> firstNum;

    cout << "두 번째 수 입력 : ";
    cin >> secondNum;

    //더한 결과값 출력
    cout << "더한 결과는 : " << firstNum + secondNum << endl;

    return 0;
}

챕터1-2. 프로그래밍 기초 (2)
데이터를 담는 여러 배열
배열을 사용하면 같은 타입의 여러 데이터를 하나의 묶음으로 관리, 반복문을 활용하여 데이터를 효율적으로 처리
- 배열 문법
배열은 임의 접근이 가능
배열의 []연산자를 통해서 각 원소에 접근

변수와 마찬가지로 배열은 선언과 동시에 초기화 및 선언 후 추후에 초기화 모두 가능

int num[5];

int num[5] = {1,2,3,4,5};

int num[5];
num={1,2,3,4,5};

배열은 통째로 복사 및 대입이 되지 않음
각 배열의 원소는 일반 변수와 같이 복사 대입 가능하지만, 배열 자체를 통째로 대입으 불가능
배열의 각원소는 변수와 동일하므로 cin,cout을 통해 입출력 가능

배열을 활용한 학생들의 총점 및 평균 출력

#include <iostream>

using namespace std;

int main()
{
    double score[5]; // 크기 5의 배열 선언

    cout <<"1 번째 학생 점수를 입력해주세요 : ";
    cin >> score[0];

    cout <<"2 번째 학생 점수를 입력해주세요 : ";
    cin >> score[1];

    cout <<"3 번째 학생 점수를 입력해주세요 : ";
    cin >> score[2];

    cout <<"4 번째 학생 점수를 입력해주세요 : ";
    cin >> score[3];

    cout <<"5 번째 학생 점수를 입력해주세요 : ";
    cin >> score[4];

    double tot = score[0] + score[1] + score[2] + score[3] + score[4];
    double avg = tot / 5;

    cout << "총점 : " << tot << endl;
    cout << "평균 : " << avg << endl;

    return 0;
}

반복 작업을 줄여주는 함수
작업의 구성 요소
인자 : 작업에 사용되는 외부 값
동작 : 어떤 작업을 수행할지 정의
반환 : 작업을 수행한 후 최종적으로 외부에 전달하는 값

기본적인 함수 정의와 호출

// 목적: 두 개의 정수를 더하는 함수 정의 및 호출 예제
#include <iostream>
using namespace std;

// 두 정수를 더하는 함수
int add(int a, int b) { // 정수형 변수 a와 b가 인자
    return a + b; // 동작 두수의 합 결과 반환(반환 타입 정수형)
}

int main() {
    int result = add(3, 7);
    cout << "3 + 7 = " << result << endl; // 출력: 3 + 7 = 10
    return 0;
}

함수에서 값을 전달하는 방식
값 전달(일반 변수)
C++에서 일반적인 변수(값 타입 변수)는 값을 복사하여 함수로 전달
딸라서 함수 내부에서 값을 변경해도 원본 변수의 값은 변경되지 않음

#include <iostream>
using namespace std;

// 함수: 값 전달 (Call by Value)
void modifyValue(int x) {
    x = 100;  // 함수 내부에서 값 변경
}

int main() {
    int num = 50;
    modifyValue(num); // 값 전달 (복사됨)

    cout << "값 전달 후 num: " << num << endl;
    // 출력: 값 전달 후 num: 50
    return 0;
}

주소값 전달(변수)
C++에서 변수의 주소값을 함수에 전달하면, 해당 변수에 접근할 수있게 됨, 따라서 함수가 종료가 된 이후에도 해당 주소의 변수는 값이 수정

#include <iostream>
using namespace std;

// 함수: 포인터를 사용한 값 변경
void modifyValue(int* ptr) {
    *ptr = 100;  // 포인터가 가리키는 변수의 값을 변경
}

int main() {
    int num = 50;
    modifyValue(&num); // num의 주소 전달

    cout << "포인터 전달 후 num: " << num << endl;
    // 출력: 포인터 전달 후 num: 100
    return 0;
}

주소값 전달(배열)
C++에서 배열의 주소값을 함수에 전달, 해당 배열에 접근 가능
함수가 종료가 된 이후에도 해당 배열의 값이 수정

#include <iostream>
using namespace std;

// 함수: 포인터를 사용한 값 변경
void modeifyArr(char* ptr) {
    ptr[0] = 'X';  // 포인터가 가리키는 변수의 값을 변경
}

int main() {
    char str[4] = {'A', 'B', 'C', 'D'};
    modeifyArr(str); // num의 주소 전달

    cout << "포인터 전달 후 str[0] = " << str[0] << endl;
    // 출력: 포인터 전달 후 str[0] = X
    return 0;
}

참조값 전달
참조자로 값을 전달하면 함수 내부에서 값을 변경할 때 원본 변수의 값도 변경

#include <iostream>
using namespace std;

// 함수: 참조를 사용한 값 변경
void modifyValueByReference(int& x) {
    x = 200;  // 참조를 사용하여 원본 값 변경
}

int main() {
    int num = 50;
    modifyValueByReference(num); // 참조 전달

    cout << "참조 전달 후 num: " << num << endl;
    // 출력: 참조 전달 후 num: 200
    return 0;
}

이름 형식 변환 함수 구현해보기

#include <iostream>
#include <string>
using namespace std;

/**
 * @brief 이름과 성을 입력받아 "성 이름" 형식으로 변환하는 함수
 * @param firstName 이름
 * @param lastName 성
 * @return string 변환된 이름
 */
string formatName(string firstName, string lastName) {
    return lastName + " " + firstName; // 문자열 결합
}

int main() {
    string firstName = "철수";
    string lastName = "김";
    cout << "이름 형식 변환: " << formatName(firstName, lastName) << endl;
    return 0;
}

C++ 프로그래머스 연습
간단한 논리 연산
문제 설명
boolean 변수 x1, x2, x3, x4가 매개변수로 주어질 때, 다음의 식의 true/false를 return 하는 solution 함수를 작성해 주세요.

(x1 ∨ x2) ∧ (x3 ∨ x4)

∨과 ∧의 진리표는 다음과 같습니다.

xyx ∨ yx ∧ y
TTTT
TFTF
FTTF
FFFF

통과 답안

#include <string>
#include <vector>
#include <iostream>
using namespace std;

bool solution(bool x1, bool x2, bool x3, bool x4) {
    bool answer = true;
    int v1 = x1 + x2 + x3 + x4;
    int inverse_v = 0;
    if(v1<=2){
        inverse_v = 0;
        if(x1!=x2 && x3!=x4){
            inverse_v=1;
        }
    }
    else if(v1>=3){
        inverse_v = 1;
    }
    answer = inverse_v;

    return answer;
}

다른 사람 풀이

#include <string>
#include <vector>

using namespace std;

bool solution(bool x1, bool x2, bool x3, bool x4) {
    bool answer = true;
    answer = (x1 | x2) & (x3 | x4);
    return answer;
}

주사위 게임 3
문제 설명
1부터 6까지 숫자가 적힌 주사위가 네 개 있습니다. 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다.

네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점을 얻습니다.
세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)2 점을 얻습니다.
주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점을 얻습니다.
어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점을 얻습니다.
네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.
네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a, b, c, d로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.

제한사항
a, b, c, d는 1 이상 6 이하의 정수입니다.

통과 답안

#include <string>
#include <vector>
#include <map>
#include <cmath>
using namespace std;

int solution(int a, int b, int c, int d) {
    int answer = 0;
    map<int,int> counts;
    counts[a] +=1;
    counts[b] +=1;
    counts[c] +=1;
    counts[d] +=1;
    if(counts.size()==1){
        answer = a * 1111;
    }
    if(counts.size()==2){
        int sum_num = 0;
        int abs_sub = 0;
        int p;
        int q;
        for (auto const& [key, val] : counts) {    
            if(val==2){
                if(abs_sub!=0 ){
                    abs_sub -= key;
                }
                if(sum_num!=0){
                    sum_num += key;
                }
                else{
                    sum_num=key;
                    abs_sub=key;  
                }       
            }
            else{
                if(val==3){
                    p=key;
                }
                else{
                    q=key;
                }
            }

        }
        if(sum_num!=0 && abs_sub!=0){
            answer = sum_num * abs(abs_sub);
        }
        else{
            answer = pow(10*p+q,2);
        }
    }
    if(counts.size()==3){
        int mul=0;
        for (auto const& [key, val] : counts) {
            if(val==1){
                if(mul!=0){
                    mul*=key;
                }
                else{
                   mul = key; 
                }
            }
        }
        answer = mul;
    }
    if(counts.size()==4){
        int min_num = 7;
        for (auto const& [key, val] : counts) {
            if(key<min_num){
                min_num=key;
            }
        }
        answer =min_num;
    }

    return answer;
}

다른 사람 풀이

#include <string>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

int solution(int a, int b, int c, int d) {
    int answer = 0;

    vector<int> table(6);
    table[a-1]++;    table[b-1]++;    table[c-1]++;    table[d-1]++;
    vector<vector<int>> nums(5);    
    nums[table[0]].emplace_back(1);
    nums[table[1]].emplace_back(2);
    nums[table[2]].emplace_back(3);
    nums[table[3]].emplace_back(4);
    nums[table[4]].emplace_back(5);
    nums[table[5]].emplace_back(6);

    if(!nums[4].empty())    
    {
        return 1111*nums[4][0];
    }
    else if(!nums[3].empty())    
    {
        return pow(10*nums[3][0]+nums[1][0],2);
    }
    else if(nums[2].size() == 2)    
    {
        return (nums[2][0]+nums[2][1])*abs(nums[2][0]-nums[2][1]);
    }
    else if(nums[2].size() == 1)
    {
        return nums[1][0]*nums[1][1];
    }
    else
    {
        return *min_element(nums[1].begin(),nums[1].end());
    }

    return answer;
}

글자 이어 붙여 문자열 만들기
문제 설명
문자열 my_string과 정수 배열 index_list가 매개변수로 주어집니다. my_string의 index_list의 원소들에 해당하는 인덱스의 글자들을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

제한사항
1 ≤ my_string의 길이 ≤ 1,000
my_string의 원소는 영소문자로 이루어져 있습니다.
1 ≤ index_list의 길이 ≤ 1,000
0 ≤ index_list의 원소 < my_string의 길이

통과 답안

#include <string>
#include <vector>
#include <iostream>
using namespace std;

string solution(string my_string, vector<int> index_list) {
    string answer = "";
    for(int i:index_list){
        answer +=my_string[i];
    }
    return answer;
}

9로 나눈 나머지
문제 설명
음이 아닌 정수를 9로 나눈 나머지는 그 정수의 각 자리 숫자의 합을 9로 나눈 나머지와 같은 것이 알려져 있습니다.
이 사실을 이용하여 음이 아닌 정수가 문자열 number로 주어질 때, 이 정수를 9로 나눈 나머지를 return 하는 solution 함수를 작성해주세요.

제한사항
1 ≤ number의 길이 ≤ 100,000
number의 원소는 숫자로만 이루어져 있습니다.
number는 정수 0이 아니라면 숫자 '0'으로 시작하지 않습니다.

통과 답안

#include <string>
#include <vector>
#include <iostream>
using namespace std;

int solution(string number) {
    int sum =0;
    for(char c : number){
        int num = c - '0';
        sum+=num;
    }
    int answer = sum%9;
    return answer;
}

평균 구하기
문제 설명
정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.

제한사항
arr은 길이 1 이상, 100 이하인 배열입니다.
arr의 원소는 -10,000 이상 10,000 이하인 정수입니다.

통과 답안

#include <string>
#include <vector>
#include <iostream>
using namespace std;

double solution(vector<int> arr) {
    double answer = 0;
    double sum = 0;
    for(int i:arr){
        sum+=i;
    }

    answer = sum/arr.size();
    return answer;
}

다른 사람 풀이

#include <string>
#include <vector>
#include <numeric>
using namespace std;

double solution(vector<int> arr) {
    double answer = accumulate(arr.begin(), arr.end(), 0);

    return answer / arr.size();
}

가장 많이 받은 선물
문제 설명
선물을 직접 전하기 힘들 때 카카오톡 선물하기 기능을 이용해 축하 선물을 보낼 수 있습니다. 당신의 친구들이 이번 달까지 선물을 주고받은 기록을 바탕으로 다음 달에 누가 선물을 많이 받을지 예측하려고 합니다.

두 사람이 선물을 주고받은 기록이 있다면, 이번 달까지 두 사람 사이에 더 많은 선물을 준 사람이 다음 달에 선물을 하나 받습니다.
예를 들어 A가 B에게 선물을 5번 줬고, B가 A에게 선물을 3번 줬다면 다음 달엔 A가 B에게 선물을 하나 받습니다.
두 사람이 선물을 주고받은 기록이 하나도 없거나 주고받은 수가 같다면, 선물 지수가 더 큰 사람이 선물 지수가 더 작은 사람에게 선물을 하나 받습니다.
선물 지수는 이번 달까지 자신이 친구들에게 준 선물의 수에서 받은 선물의 수를 뺀 값입니다.
예를 들어 A가 친구들에게 준 선물이 3개고 받은 선물이 10개라면 A의 선물 지수는 -7입니다. B가 친구들에게 준 선물이 3개고 받은 선물이 2개라면 B의 선물 지수는 1입니다. 만약 A와 B가 선물을 주고받은 적이 없거나 정확히 같은 수로 선물을 주고받았다면, 다음 달엔 B가 A에게 선물을 하나 받습니다.
만약 두 사람의 선물 지수도 같다면 다음 달에 선물을 주고받지 않습니다.
위에서 설명한 규칙대로 다음 달에 선물을 주고받을 때, 당신은 선물을 가장 많이 받을 친구가 받을 선물의 수를 알고 싶습니다.

친구들의 이름을 담은 1차원 문자열 배열 friends 이번 달까지 친구들이 주고받은 선물 기록을 담은 1차원 문자열 배열 gifts가 매개변수로 주어집니다. 이때, 다음달에 가장 많은 선물을 받는 친구가 받을 선물의 수를 return 하도록 solution 함수를 완성해 주세요.

제한사항
2 ≤ friends의 길이 = 친구들의 수 ≤ 50
friends의 원소는 친구의 이름을 의미하는 알파벳 소문자로 이루어진 길이가 10 이하인 문자열입니다.
이름이 같은 친구는 없습니다.
1 ≤ gifts의 길이 ≤ 10,000
gifts의 원소는 "A B"형태의 문자열입니다. A는 선물을 준 친구의 이름을 B는 선물을 받은 친구의 이름을 의미하며 공백 하나로 구분됩니다.
A와 B는 friends의 원소이며 A와 B가 같은 이름인 경우는 존재하지 않습니다.

통과 답안

#include <string>
#include <vector>
#include <sstream>
#include <unordered_map>
#include <algorithm>
#include <iostream>
using namespace std;

int solution(vector<string> friends, vector<string> gifts) {
    int answer = 0;
    unordered_map<string, vector<string>> gift_user;
    unordered_map<string, int> counts;

    for(string& g : gifts){
        stringstream ss(g);
        string giver, receiver;
        ss >> giver >> receiver;
        gift_user[giver].push_back(receiver);
        counts[giver] +=1;
        counts[receiver]-=1;
    }
    int max_gifts = 0;
    for(auto& [key,value] : gift_user){
        int gift_count =0;
        cout<<key<<endl;
        for(string& f : friends){
            if(gift_user.find(f) != gift_user.end()){
                int g_r = count(gift_user[key].begin(), gift_user[key].end(), f);
                int r_g = count(gift_user[f].begin(), gift_user[f].end(), key);
                cout<<r_g<<endl;
                if((g_r - r_g)==0){
                    if(counts[key]>counts[f]){
                        gift_count+=1;
                    }
                }
                else if(g_r>r_g){
                    gift_count+=1;
                }          
            }
            else{
                gift_count+=1;     
            }

        }

        if(max_gifts<gift_count){
            max_gifts= gift_count;
        }
    }
    answer = max_gifts;
    return answer;

}

다른 사람 풀이

#include <string>
#include <vector>
#include <map>
#include <sstream>

using namespace std;

int solution(vector<string> friends, vector<string> gifts) {

    vector<int> point(friends.size(), 0);
    vector<vector<int>> count(friends.size(), vector<int>(friends.size(), 0));
    map<string, int> m;

    for(int i=0;i< friends.size(); i++) 
        m.insert({friends[i], i});

    for(int i = 0; i < gifts.size(); i++) {
        string from, to;
        stringstream parse(gifts[i]);
        parse >> from >> to;

        int fromIdx = m[from], toIdx = m[to];
        count[fromIdx][toIdx]++;

        point[fromIdx]++;
        point[toIdx]--;
    }

    int ans = 0;

    for(int i = 0; i < friends.size(); i++) {
        int res = 0;

        for(int j = 0; j < friends.size(); j++) {
            if(i == j || count[i][j] < count[j][i]) continue;

            if(count[i][j] > count[j][i]) res++;
            else {
                if(point[i] > point[j]) res++;
            }
        }

        ans = max(res, ans);
    }

    return ans;
}

문자열 여러 번 뒤집기
문제 설명
문자열 my_string과 이차원 정수 배열 queries가 매개변수로 주어집니다. queries의 원소는 [s, e] 형태로, my_string의 인덱스 s부터 인덱스 e까지를 뒤집으라는 의미입니다. my_string에 queries의 명령을 순서대로 처리한 후의 문자열을 return 하는 solution 함수를 작성해 주세요.

제한사항
my_string은 영소문자로만 이루어져 있습니다.
1 ≤ my_string의 길이 ≤ 1,000
queries의 원소는 [s, e]의 형태로 0 ≤ s ≤ e < my_string의 길이를 만족합니다.
1 ≤ queries의 길이 ≤ 1,000

통과 답안

#include <string>
#include <vector>

using namespace std;

string solution(string my_string, vector<vector<int>> queries) {
    string answer = "";
    for(int q=0; q<queries.size(); q++){
        int s = queries[q][0];
        int e = queries[q][1];
        string temp_string = "";
        for(int i=e; i>=s; i--){
            temp_string += my_string[i];
        }
        my_string.replace(s, temp_string.length(), temp_string);
    }
    answer = my_string;
    return answer;
}

다른 사람 풀이

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string solution(string my_string, vector<vector<int>> queries) {
    for(const auto& q : queries)
    {
        reverse(my_string.begin()+q[0],my_string.begin()+q[1]+1);
    }
    return my_string;
}
profile
개발합시다!

0개의 댓글