문제(내적)
https://school.programmers.co.kr/learn/courses/30/lessons/70128
제출한 답안
#include <string>
#include <vector>
using namespace std;
int solution(vector<int> a, vector<int> b) {
int answer = 0;
for (int i = 0; i < a.size(); i++)
{
answer += a[i] * b[i];
}
return answer;
}
문제(약수의 개수와 덧셈)
https://school.programmers.co.kr/learn/courses/30/lessons/77884
제출한 답안
#include <string>
#include <vector>
using namespace std;
int solution(int left, int right) {
int answer = 0;
for (int i = left; i <= right; i++)
{
int count = 0;
for (int j = 1; j <= i; j++)
{
if (i % j == 0)
{
count++;
}
}
if (count % 2 == 0)
{
answer += i;
}
else
{
answer -= i;
}
}
return answer;
}
문제(문자열 내림차순으로 배치하기)
https://school.programmers.co.kr/learn/courses/30/lessons/12917
제출한 답안
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(char& a, char& b)
{
return a > b;
}
string solution(string s) {
string answer = "";
sort(s.begin(), s.end(), compare);
answer = s;
return answer;
}
문제(부족한 금액 계산하기)
https://school.programmers.co.kr/learn/courses/30/lessons/82612
제출한 답안
using namespace std;
long long solution(int price, int money, int count)
{
long long answer = 0;
long long totalPrice{};
for (int i = 1; i <= count; i++)
{
totalPrice += price * i;
}
answer = money - totalPrice;
if (answer > 0)
{
return 0;
}
answer *= -1;
return answer;
}
문제(문자열 다루기 기본)
https://school.programmers.co.kr/learn/courses/30/lessons/12918
제출한 답안
#include <string>
#include <vector>
#include <cctype>
#include <iostream>
using namespace std;
bool solution(string s) {
if (s.size() != 4 && s.size() != 6)
{
return false;
}
for (int i = 0; i < s.size(); i++)
{
if (isdigit(s[i]) == 0)
{
return false;
}
}
return true;
}
isdigit(int) 함수는 인수로 char형이 들어오면 아스키코드의 숫자로 들어가기 때문에 인수가 int형이라고 적혀있다. 그래서 들어온 값이 숫자에 해당하는 아스키코드 값인지 확인해서 숫자에 해당하면 0이 아닌값(true)을 반환하고, 숫자에 해당하지 않는다면 0(false)를 반환하는 함수이다. 이걸로 각 자리마다 문자인지 숫자인지 판별이 가능하다.(cctype파일 포함시키기)
GAS 튜토리얼 남은 분량 전부 읽어보기
https://dev.epicgames.com/community/learning/tutorials/8Xn9/unreal-engine-epic-for-indies-your-first-60-minutes-with-gameplay-ability-system#introductiontotargetedabilities
문제(행렬의 덧셈)
https://school.programmers.co.kr/learn/courses/30/lessons/12950
제출한 답안
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
vector<vector<int>> answer(arr1.size(), vector<int>(arr1[0].size(), 0));
for (int i = 0; i < arr1.size(); i++)
{
for (int j = 0; j < arr1[i].size(); j++)
{
answer[i][j] = arr1[i][j] + arr2[i][j];
}
}
return answer;
}
이차원 벡터를 사용하려면 공간까지 다 잡히도록 초기화를 해주고 사용해야 한다. 그냥 {}를 붙히고 사용하니 오류가 생겼는데, illegal instruction(core dumped)라고만 나타나서 공간이 없는 벡터의 공간을 사용하려해서 뜨는 오류라고 알기가 힘들다.(물론 이 오류의 원인이 없는 공간 사용만이 아니라 다른 이유에서도 뜨긴 한다.)
문제(직사각형 별찍기)
https://school.programmers.co.kr/learn/courses/30/lessons/12969
제출한 답안
#include <iostream>
using namespace std;
int main(void) {
int a;
int b;
cin >> a >> b;
for (int i = 0; i < b; i++)
{
for (int j = 0; j < a; j++)
{
cout << "*";
}
cout << endl;
}
return 0;
}
문제(최대공약수와 최소공배수)
https://school.programmers.co.kr/learn/courses/30/lessons/12940
제출한 답안
#include <string>
#include <vector>
using namespace std;
int gcd(int n, int m)
{
int temp = 0;
while (m != 0)
{
temp = n % m;
n = m;
m = temp;
}
return n;
}
int lcm(int n, int m)
{
return n * m / gcd(n, m);
}
vector<int> solution(int n, int m) {
vector<int> answer;
answer.push_back(gcd(n, m));
answer.push_back(lcm(n, m));
return answer;
}
최대공약수와 최소공배수를 구하는 방법은 알아두자. 최대공약수는 유클리드 호제법을 이용하면 구하기 쉽다.(gcd함수 내용이 유클리드 호제법, while문이 아니라 재귀함수로도 구현 가능)
최소공배수는 더 쉽다. 최대공약수를 알고 있다면 바로 구할 수 있다.a * b = gcd(a, b) * lcm(a, b)
이 식이 참이기 때문에 이걸 이용해 lcm처럼 구현하면 최소공배수를 바로 알 수 있다.
문제(3진법 뒤집기)
https://school.programmers.co.kr/learn/courses/30/lessons/68935
제출한 답안
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
vector<int> convert(int n)
{
vector<int> ternary{};
while (n > 0)
{
ternary.push_back(n % 3);
n /= 3;
}
return ternary;
}
int solution(int n) {
int answer = 0;
vector<int> three = convert(n);
int index = 0;
for (int i = three.size() - 1; i > -1; i--)
{
answer += three[index] * pow(3, i);
index++;
}
return answer;
}
10진법을 n진법으로 바꾸는 방법과 n진법을 10진법으로 바꾸는 방법을 알아야 한다. 원래 3진법은 convert함수에서 ternary벡터를 reverse함수로 뒤집어야 진짜 3진수인데 문제가 3진수를 다시 뒤집기 때문에 reverse를 안 썼다.
for문의 i를 꼭 0부터 어디까지 증가하면서 사용하는 것 말고도 제출한 답안처럼 감소하면서 사용하는 것도 생각하면 유용하다.
10진법에서 N진법으로 바꾸는 법 : 10진법 숫자 X가 있을때, X를 N으로 나눌 수 있을 때까지 나누고 나머지를 반대로 적어준다.
10진법 -> 3진법 예시
N진법에서 10진법으로 바꾸는 법 : N진법 각 숫자에 뒤에서부터 N의 0승부터 곱해서 더해준다.
3진법 -> 10진법 예시