*오늘의 코드카타*
두 정수 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 |