TIL
05.21 TIL (ch.2 팀프로젝트 day1)
2026. 5. 21. 21:07

*오늘의 코드카타*

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수 solution을 완성하세요.

예를 들어, a = 3, b = 5 인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.

a와 b가 같은 경우는 둘 중 아무 수나 리턴하고, a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.

a와 b의 대소 관계는 정해져있지 않습니다.

 

(1) cmath 헤더 추가와 절댓값

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

using namespace std;

long long solution(int a, int b) {
    long long answer = 0;
    long long count = abs((long long)a - b) + 1;
    answer = count * (a + b) / 2;
    
    return answer;
}

정수들의 합을 1 간격으로 더할 때에는 가우스 법칙만한게 없다.

a 와 b 의 사이의 정수들의 합이 너무나 커지면 안되기 때문에 반드시 long long을 써줘야 한다.

또한, a와 b 둘 중 누가 큰 지 모르기 때문에 절댓값을 사용하면 된다.

 

(2) algorithm 헤더와 for 문

절댓값을 사용하는 건 이제 잘 기억해 놓고, 사실 처음에 생각해봤던 건 min과 max였다. 둘 중 작은 값을 앞에 놓고, 큰 값을 맨 뒤에 놓은 후 그 사이의 정수를 스캔하면서 다 더하는 것이다.

#include <algorithm>

using namespace std;

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

	int start = min(a, b);
    int end = max(a, b);
    
    for (int i = start; i <= end; ++i) {
        answer += i;
    }
    
    return answer;
}

 


*그 외에 오늘 한 것*

[프로그래머스]

마지막 두 원소

1. 리스트의 마지막 원소와 그 앞의 원소를 가져온다.

2. 두 값을 비교해서 조건문에 따라 계산한다

3. 계산된 값을 리스트 맨 끝에 추가한다.

#include <vector>

using namespace std;

vector<int> solution(vector<int> num_list) {
    int n = num_list.size();

    int last = num_list[n - 1];
    int prev = num_list[n - 2];
    
    if (last > prev) {
        num_list.push_back(last - prev);
    }
    else {
        num_list.push_back(last * 2);
    }
    
    return num_list;
}

 

수 조작하기 1

(1) for - if

#include <string>
#include <vector>

using namespace std;

int solution(int n, string control) {
    int answer = 0;
    
    for (int i = 0; i < control.length(); i++) {
        if (control[i] == 'w') {
            n += 1;
        }
        else if (control[i] == 's') {
            n -= 1;
        }
        else if (control[i] == 'd') {
            n += 10;
        } 
        else if (control[i] == 'a') {
            n -= 10;
        }
    }
    answer = n;
    
    return answer;
}

문자 하나는 's'. 문자열은 "s". 큰 따옴표를 쓰면 사실 숨어있는 \0(null) 값이 존재해서 에러가 난다. 편하다고 자꾸 큰따옴표 쓰지 말자.

 

(2) Range - for

#include <string>

using namespace std;

int solution(int n, string control) {
    for (char c : control) {
        if (c == 'w') {
            n += 1;
        } else if (c == 's') {
            n -= 1;
        } else if (c == 'd') {
            n += 10;
        } else if (c == 'a') {
            n -= 10;
        }
    }
    return n;
}

 

(3) Switch

#include <string>

using namespace std;

int solution(int n, string control) {
    for (char c : control) {
        switch (c) {
            case 'w': 
                n += 1; 
                break;
            case 's': 
                n -= 1; 
                break;
            case 'd': 
                n += 10; 
                break;
            case 'a': 
                n -= 10; 
                break;
        }
    }
    
    return n;
}

이렇게 정해진 문자가 주어진 경우 switch 문을 활용하는 게 더 정확하고 안전한 방법이다. 메뉴 선택 화면을 만드는 것과 동일하다고 생각하면 된다. 대신 break를 잘 쓰자.

 

수 조작하기 2

(1) for문

#include <string>
#include <vector>

using namespace std;

string solution(vector<int> numLog) {
    string answer = "";
    for (int i = 1; i < numLog.size(); i++) {
        int dif = numLog[i] - numLog[i-1];
        
        if (dif == 1) {
            answer += 'w';
        }
        else if (dif == -1) {
            answer += 's';
        }
        else if (dif == 10) {
            answer += 'd';
        }
        else if (dif == -10) {
            answer += 'a';
        }
    }
    return answer;
}

뒤의 숫자 - 앞의 숫자 = 이번에 입력한 값. 그래서 i = 1 부터 시작해야 한다.

 

(2) map 컨테이너를 사용하기

w, s, a, d 를 입력하면 정해진 값을 더하는 방식이라고 생각해보면, 사실 입력값은 다 정해져 있다. dif를 키값이라고 생각하고, 해당되는 문자열을 출력하기만 하면 그만이다. 정해져 있으면 map 컨테이너를 사용해보자.

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

using namespace std;

string solution(vector<int> numLog) {
	string answer = "";
    
    map<int, char> controlMap = {
    {1, 'w'},
    {-1, 's'},
    {10, 'd'},
    {-10, 'a'}
 	};
    
    for (int i = 1; i < numLog.size(); i++) {
    	int dif = numLog[i] - numLog[i-1];
    
    	answer += controlMap[diff];
    }
    return answer;
}

 

수열과 구간 쿼리 3

(1) Range - for

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> arr, vector<vector<int>> queries) {
    for (vector<int> query : queries) {
        int i = query[0];
        int j = query[1];
        
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    vector<int> answer = arr;
    return answer;
}

temp를 만들어서 arr[j]를 저장한 다음에, arr[i]에 arr[j]를 덧씌우고 다시 arr[j]에는 temp를 덧씌우는 Range-for문을 작성했다.

 

(2) swap

C++에는 <algorithm> 라이브러리의 swap()을 지원하니까 써보자.

#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> arr, vector<vector<int>> queries) {
    for (vector<int> query : queries) {
        int i = query[0];
        int j = query[1];

        swap(arr[i], arr[j]);
    }
    
    return arr;
}

이러면 굳이 데이터가 겹치면서 없어지는 불상사를 막기 위해 temp를 쓰는 번거로움을 덜 수 있다.

 

수열과 구간 쿼리 2

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> arr, vector<vector<int>> queries) {
    vector<int> answer;

    for (vector<int> query : queries) {
        int s = query[0];
        int e = query[1]; 
        int k = query[2];
        int min_val = -1;  

        for (int i = s; i <= e; i++) {
            if (arr[i] > k) {
                if (min_val == -1 || arr[i] < min_val) {
                    min_val = arr[i];
                }
            }
        }  
        answer.push_back(min_val);
    }
    return answer;
}

쿼리가 2개씩 꼬이면서 이제 슬슬 머리도 꼬이는데, 계속 뚫어져라 노려보니까 읽는 데 좀 편해진 것 같다. 하나의 값을 넣기보다 배열 하나씩을 넣는 것이 더 어려운 느낌이다.

min_val을 -1로 잡은 이유는 어차피 못 찾으면 -1 값을 넣어야 하니까 미리 초기화를 시켜주고 조건에 맞지 않는 경우 그냥 min_val을 넣어버리기 위해서다.

for문을 거쳐서 모든 쿼리들을 다 살펴본 다음, 가장 작은 값을 정답 배열에 밀어넣는다.

 

 

[atanny]

언리얼 C++ 빌드 프로세스 이해 : C++ 코드 빌드 과정 순서, 라이브 코딩 기능(Ctrl+Alt+F11), 컴파일 단계 이해, 링크 단계에서의 정의되지 않은 외부 심볼 오류

 

Actor 생명주기와 컴포넌트 구조 이해 : Actor의 생명주기 함수들의 실행 순서(Constructor(생성자)-BeginPlay(호출)-Tick(매 프레임 호출)-EndPlay(소멸 시 호출)), BeginPlay함수(Actor의 모든 컴포넌트가 초기화된 후 호출됨), Tick 함수의 DeltaTime 매개변수(이전 프레임과 현재 프레임 사이의 시간 간격)

 

 

[C++ 프로젝트]

C++ Text RPG(팀 프로젝트) --> 시작

 

 

 

 

'TIL' 카테고리의 다른 글

05.29 TIL (ch.2 팀프로젝트 day6)  (0) 2026.05.29
05.28 TIL (ch.2 팀프로젝트 day5)  (0) 2026.05.28
05.27 TIL (ch.2 팀프로젝트 day4)  (0) 2026.05.27
05.26 TIL (ch.2 팀프로젝트 day3)  (0) 2026.05.26
05.22 TIL (ch.2 팀프로젝트 day2)  (0) 2026.05.22