중간고사
최대 공약수 구하기
// 최대 공약수
void postDiv(int &denum, int &num)
{
int div = 0;
int min = denum > num ? num : denum;
for (int i = min; i > 0; i--)
{
if (denum % i == 0 && num % i == 0)
{
div = i;
break;
}
}
denum /= div;
num /= div;
}
또는 (교수님 코드)
최대 공약수로 나누어진 값을 구하는 경우. 최대 공약수를 구하고 해당 값을 나누는 경우도 있지만 바로 구할 수도 있음.
void postDiv(int &denum, int &num)
{
for (int i = 2; denum > 1 && num > 1 && num >= i;)
{
// 같은 숫자로 여러번 나누어 줄지도 모르기 때문에 또다시 동일한 i로 한 번 더 나눠 볼 수 있도록 확인하는 것이다.
if (denum % i == 0 && num % i == 0)
{
denum = denum / i;
num = num / i;
}
else
i++;
}
}
최소 공배수 구하기
// 최소 공배수
for (int i = max;; i++)
{
if (i % n1 == 0 && i % n2 == 0)
{
ans = i;
break;
}
}
팩토리얼
한 자리씩 더한 값 구하기
int solution(int n)
{
int answer = 0;
for (int i = n; i > 0; i = i / 10)
{
// 🌟여기가 i라는 점! n으로 하면 좢됨
answer += i % 10;
}
cout << answer << endl;
return answer;
}
반복문 안에 i로 나누어야 되는 것을 잊지 말자 진짜ㅜㄹ,,,,
회전시킨다.
bool getRotate(string A, string B, int dim)
{
bool isSame = true;
for (int i = 0; i < A.size(); i++)
{
if (A[i] != B[(dim + i) % B.size()])
{
isSame = false;
}
}
return isSame;
}
이동한 횟수 (dimm) + i = 가 되버리면 잘 검사하다가 outOfRange가 발생하기 때문에 회전 시키기 위해서는 전체 사이즈(B.size())로 나눈 나머지를 이용해서 회전 시키면 됨.(원형큐같은 느낌)
전체 합과 개수를 이용해서 해당하는 등차수열 값 구하기
using namespace std;
vector<int> solution(int num, int total)
{
vector<int> answer;
// 해당 개수만큼 등차수열 구하기
int middleNum = total / num;
int loop = num / 2; // middleNum 기준으로 앞뒤개수
if (num % 2 == 0)
loop--;
int standard = middleNum - loop;
for (int i = standard; i < num + standard; i++)
{
answer.push_back(i);
}
for (auto i : answer)
cout << i << endl;
return answer;
}
문자열 <-> 정수형
대문자는 소문자로, 소문자는 대문자로 바꾸기
char change(char c)
{
if (c > 'Z') // lower case
{
c -= 'a' - 'A';
}
else // upper case
{
c += 'a' - 'A';
}
return c;
}
-> 비슷한 문제
char getChanged(char c)
{
if (c >= 'a') // 소문자라면
c -= 'a' - 'A';
else
c += 'a' - 'A';
return c;
}
string solution(string s) {
string answer = "";
// 짝수번재는 알파벳은 대문자로, 홀수번재 알파벳은 소문자로
int k = 0; // 공백기준 단어의 인덱스 판별을 위해서 사용
for (int i = 0; i < s.size(); i++)
{
if ((s[i] >= 'a' && s[i] <= 'z') && (k % 2 == 0))
{
answer += (s[i] - ('a' - 'A'));
k++;
}
else if ((s[i] >= 'A' && s[i] <= 'Z') && (k % 2 != 0))
{
answer += (s[i] + ('a' - 'A'));
k++;
}
else if (s[i] == ' ')
{
answer += s[i];
k = 0;
}
else
{
answer += s[i];
k++;
}
}
return answer;
}
2진수, 10진수 변환
10진수 -> 2진수
int tenConvertTwo(int num)
{
int n = 8;
int result = 0;
int k = 1;
for (int i = n; i > 0; i /= 2, k *= 10)
{
result += (i % 2) * k;
}
return result;
}
2진수 -> 10진수
int twoConvertTen(int num)
{
int result = 0;
int num = 1000;
int k = 1;
for (int i = num; i > 0; i /= 10, k *= 2)
{
result += (i % 10) * k;
}
return result;
}
졸 멋진 코드(feat.김철연)
2진수 덧셈 계산 코드… 걍 외우기! ->
#include <iostream>
#include <string>
using namespace std;
int getDigit(string bin, int i)
{
// i번째란 뒤에서부터 i 번째라는 의미
// ?? 근데 만약에 bin1이랑 bin2길이가 다르면 없는 인덱스도 있을 텐데 그거에 대한 i는 어떻게 뽑는다는 거지? 짧은 거를 기준으로 len을 잡고 그외의 나머지는 makeAnswer를 통해서 그냥 붙혀나갸야되는거 아닌가?
// 해결책 : if 문
if (bin.length() > i)
{
return bin[bin.length() - i - 1] - '0';
// '0'을 빼야 진짜로 integer 가 리턴된다. 그렇지 아니면 0또는 1의 문자의 아스키코드가 리턴된다.
}
else
{
return 0;
}
}
string makeAnswer(string ans, int i)
{
if (i == 1)
{
return "1" + ans;
}
else
{
return "0" + ans;
}
}
string solution(string bin1, string bin2)
{
string answer = "";
int a, b, c, s; // a = getDigit(bin1, i);, b = getDigit(bin2, i);
// i번째 값을 리턴해주는 디짓
// c는 자리올림
c = 0;
int len = bin1.length();
if (len < bin2.length())
{
len = bin2.length();
}
for (int i = 0; i < len; i++)
{
a = getDigit(bin1, i);
b = getDigit(bin2, i);
s = (a + b + c) % 2; // 뒷자리
c = (a + b + c) / 2; // carry-out
answer = makeAnswer(answer, s);
// s를 asnwer에 계속 추가해서 아무튼 새로운 답을 늘려나갈것이다.
}
if (c == 1)
{
answer = makeAnswer(answer, c);
}
cout << answer << endl;
return answer;
}
int main()
{
solution("11", "1000");
}
stoi
// string -> int로 바꿔줌
int my_stoi(string num)
{
int k = 1;
int n = 0;
for (int i = num.length() - 1; i >= 0; i--, k *= 10)
{
n += (num[i] - '0') * k;
}
return n;
}
itos
// int -> string으로 바꿔줌
string my_itos(int n)
{
string num = "";
for (int i = n; i > 0; i /= 10)
{
char temp = (i % 10) + '0';
num = temp + num;
}
return num;
}
tokenize
vector<string> tokenize(string letter)
{
vector<string> tokens;
int i, j;
for (i = 0; i < letter.length(); i = j + 1)
{
for (j = i; j < letter.length(); j++)
{
if (letter[j] == ' ')
{
tokens.push_back(letter.substr(i, j - i));
break; // 🌟
}
}
if (j == letter.length())
{
tokens.push_back(letter.substr(i, j - i + 1));
}
}
return tokens;
}
소인수 집합 구하기
vector<int> solution(int n)
{
vector<int> answer;
for (int i = 1; i <= n; i++)
{
if (n % i == 0)
{
answer.push_back(i);
// 🌟i라는 인수로 나누어 떨어진다면 계속 나누어서 없애버리기!
while (n % i == 0)
{
n = n / i;
}
}
}
return answer;
}
find 함수 사용법
auto it = find(morse.begin(), morse.end(), temp);
int index = it - morse.begin();
최빈값 구하기
int solution(vector<int> array)
{
int answer = 0;
int count[1000];
int mode;
int modeCount = -1;
bool duplicate = false;
// 0으로 초기화
for (int i = 0; i < 1000; i++)
count[i] = 0;
// array에 있는 숫자를 인덱스로 간주하여 그 숫자가 나올때마다 ++을 하는 형식
for (int i = 0; i < array.size(); i++)
count[array[i]]++;
for (int i = 0; i < 1000; i++)
{
// max 구하기
if (count[i] > modeCount)
{
mode = i;
modeCount = count[i];
duplicate = false; // 동점자인지 아닌지
}
else if (count[i] == modeCount)
{
duplicate = true;
}
}
if (!duplicate)
answer = mode;
else
answer = -1;
return answer;
}
댓글남기기