준비운동 겸 자존감 높이는데 훌륭한 레벨 1 문제들
음양 더하기
#include <iostream>
#include <vector>
using namespace std;
int solution(vector<int> absolutes, vector<bool> signs) {
int answer = 0;
int size = absolutes.size();
int i;
for (i = 0; i < size; i++) {
if (signs[i]) answer += absolutes[i];
else answer -= absolutes[i];
}
return answer;
}
약수의 개수와 덧셈
#include <iostream>
#include <vector>
#include <cmath> // sqrt
using namespace std;
int solution(int left, int right) {
int answer = 0;
int i;
for (i = left; i <= right; i++) {
int root = (int)sqrt(i);
if (root * root == i) answer -= i;
else answer += i;
}
return answer;
}
내적
#include <iostream>
#include <vector>
using namespace std;
int solution(vector<int> a, vector<int> b) {
int answer = 0;
int n = a.size();
for (int i = 0; i < n; i++)
answer += (a[i] * b[i]);
return answer;
}
두 정수 사이의 합
#include <iostream>
#include <vector>
using namespace std;
long long solution(int a, int b) {
long long answer = 0;
int i;
if (a < b) for (i = a; i <= b; i++) answer += i;
else for (i = b; i <= a; i++) answer += i;
return answer;
}
가운데 글자 가져오기
#include <iostream>
#include <string>
using namespace std;
string solution(string s) {
string answer = "";
int size = s.size();
if (size % 2) answer += s[(size - 1) / 2];
else {
answer += s[size / 2 - 1];
answer += s[size / 2];
}
return answer;
}
같은 숫자는 싫어
벡터 관련 함수들 (back(), unique()) 연습
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> arr)
{
vector<int> answer;
int i;
answer.push_back(arr[0]);
for (i = 1; i < arr.size(); i++) {
if (arr[i] != answer.back()) answer.push_back(arr[i]);
}
return answer;
}
vector<int> solution2(vector<int> arr) {
arr.erase(unique(arr.begin(), arr.end()), arr.end());
vector<int> answer = arr;
return answer;
}
나누어 떨어지는 숫자 배열
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> arr, int divisor) {
vector<int> answer;
int i;
for (i = 0; i < arr.size(); i++) {
if (arr[i] % divisor == 0) answer.push_back(arr[i]);
}
if (answer.size() == 0) answer.push_back(-1);
else sort(answer.begin(), answer.end());
return answer;
}
제일 작은 수 제거하기
벡터에서 원소 없애는 연습 (erase, remove)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> arr) {
vector<int> answer = arr;
int i, size = arr.size();
sort(arr.begin(), arr.end(), greater<int>());
int minval = arr[arr.size() - 1];
answer.erase(remove(answer.begin(), answer.end(), minval), answer.end());
if (answer.size() == 0) answer.push_back(-1);
return answer;
}
짝수와 홀수
#include <iostream>
#include <string>
using namespace std;
string solution(int num) {
return (num % 2) ? "Odd" : "Even";
}
콜라츠 추측
num
의 값을 바꿔주기 때문에 else
대신 else if
로 처리해줘야 함
#include <iostream>
using namespace std;
int solution(int num) {
int answer = 0;
while (num != 1) {
if (num % 2 == 0) num /= 2;
else if (num % 2 == 1) num = num * 3 + 1;
answer++;
if (answer == 500) {
answer = -1;
break;
}
}
return answer;
}
평균 구하기
#include <iostream>
#include <vector>
using namespace std;
double solution(vector<int> arr) {
double answer = 0;
int i;
for (i = 0; i < arr.size(); i++) answer += arr[i];
return answer / arr.size();
}
하샤드 수
#include <iostream>
using namespace std;
bool solution(int x) {
int tmp = x;
int digit = 0;
while (tmp / 10) {
digit += tmp % 10;
tmp /= 10;
}
digit += tmp % 10;
if (x % digit == 0) return true;
else return false;
}
x만큼 간격이 있는 n개의 숫자
#include <iostream>
#include <vector>
using namespace std;
vector<long long> solution(int x, int n) {
vector<long long> answer;
long long i;
for (i = 1; i <= n; i++) {
answer.push_back(x*i);
}
return answer;
}
직사각형 별찍기
#include <iostream>
using namespace std;
int main(void) {
int a, b, i, j;
cin >> a >> b;
for (i = 0; i < b; i++) {
for (j = 0; j < a; j++) cout << '*';
cout << endl;
}
return 0;
}
행렬의 덧셈
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
vector<vector<int>> answer;
int i, j;
for (i = 0; i < arr1.size(); i++) {
vector<int> tmp;
for (j = 0; j < arr1[i].size(); j++) tmp.push_back(arr1[i][j] + arr2[i][j]);
answer.push_back(tmp);
}
return answer;
}
예산
#include <iostream>
#include <string>
#include <vector>
#include <algorithm> // sort
using namespace std;
int solution(vector<int> d, int budget) {
int answer = 0;
int i = 0;
int size = d.size();
sort(d.begin(), d.end());
while (budget >= d[i] && i < size) {
budget -= d[i];
answer++;
i++;
}
return answer;
}
정수 제곱근 판별
powl
이라는 것이 있다
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
long long solution(long long n) {
long long answer = -1;
long long i;
for (i = 0; i <= ((long long)sqrt(n) + 1); i++) {
if (i * i == n) return (i + 1) * (i + 1);
}
return answer;
}
long long solution2(long long n) {
long long answer = sqrt(n);
return (powl(answer, 2) == n) ? (powl(answer + 1, 2)) : -1;
}
문자열 내 p와 y의 개수
#include <string>
#include <iostream>
using namespace std;
bool solution(string s)
{
bool answer = true;
int pcnt = 0, ycnt = 0, i;
for (i = 0; i < s.size(); i++) {
if (s[i] == 'p' || s[i] == 'P') pcnt++;
else if (s[i] == 'y' || s[i] == 'Y') ycnt++;
}
if (pcnt == ycnt) answer = true;
else answer = false;
return answer;
}
문자열 내림차순으로 배치하기
comparator 연습. sort(s.begin(), s.end(), greater<char>());
이렇게 할 수도 있구나..
#include <string>
#include <vector>
#include <algorithm> // sort
using namespace std;
bool comp(char a, char b) {
if (a > b) return true;
else return false;
}
string solution(string s) {
string answer = "";
vector<char> v;
int i, size = s.size();
for (i = 0; i < size; i++) v.push_back(s[i]);
sort(v.begin(), v.end(), comp);
for (i = 0; i < size; i++) answer += v[i];
return answer;
}
string solution2(string s) {
sort(s.begin(), s.end(), greater<char>());
return s;
}
핸드폰 번호 가리기
#include <iostream>
#include <string>
using namespace std;
string solution(string phone_number) {
string answer = "";
int i = 0;
for (i; i < phone_number.size() - 4; i++) answer += '*';
for (i; i < phone_number.size(); i++) answer += phone_number[i];
return answer;
}
3진법 뒤집기
#include <iostream>
#include <string>
#include <stack>
#include <cmath> // pow
using namespace std;
int solution(int n) {
int answer = 0;
int i = 0;
stack<int> st;
// 3진법
while (n) {
st.push(n % 3);
n /= 3;
}
while (!st.empty()) {
answer += st.top() * pow(3, i);
st.pop();
i++;
}
return answer;
}
2016년
#include <iostream>
#include <string>
using namespace std;
string day[7] = { "THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED" };
int month[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
string solution(int a, int b) {
string answer = "";
int days = 0;
int i;
for (i = 0; i < a - 1; i++) days += month[i];
days += b;
return day[days % 7];
}
최대공약수와 최소공배수
#include <iostream>
#include <vector>
using namespace std;
int gcd(int a, int b) {
int r;
while (b) {
r = a % b;
a = b;
b = r;
}
return a;
}
int lcm(int a, int b) {
int c = gcd(a, b);
return a * b / c;
}
vector<int> solution(int n, int m) {
vector<int> answer;
answer.push_back(gcd(n, m));
answer.push_back(lcm(n, m));
return answer;
}
두 개 뽑아서 더하기
정렬한 다음 unique
를 쓸 생각을 하면서 뿌듯해하고 있었는데 set
으로 푼 사람도 있었다 ㄷㄷ
중복된 원소가 없다는 성질을 이렇게 써먹다니.. 오늘도 배우고 갑니다
#include <iostream>
#include <string>
#include <vector>
#include <algorithm> // sort
#include <set>
using namespace std;
vector<int> solution(vector<int> numbers) {
vector<int> answer;
int i, j, size;
size = numbers.size();
for (i = 0; i < size - 1; i++) {
for (j = i + 1; j < size; j++) {
answer.push_back(numbers[i] + numbers[j]);
}
}
sort(answer.begin(), answer.end());
answer.erase(unique(answer.begin(), answer.end()), answer.end());
return answer;
}
vector<int> solution(vector<int> numbers) {
vector<int> answer;
vector<int> st;
int i, j, size;
size = numbers.size();
for (i = 0; i < size - 1; i++) {
for (j = i + 1; j < size; j++) {
st.insert(numbers[i] + numbers[j]);
}
}
answer.assign(st.begin(), st.end());
return answer;
}
문자열 내 마음대로 정렬하기
#include <iostream>
#include <string>
#include <vector>
#include <algorithm> // sort
using namespace std;
int idx;
bool comp(string a, string b) {
if (a[idx] == b[idx]) return a < b;
else return a[idx] < b[idx];
}
vector<string> solution(vector<string> strings, int n) {
idx = n;
sort(strings.begin(), strings.end(), comp);
return strings;
}
완주하지 못한 선수
시퀀스 컨테이너만 거의 쓰다보니 map이나 set같은 연관 컨테이너에 대한 경험이나 공부가 부족하다는 걸 느꼈다
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
string solution(vector<string> participant, vector<string> completion) {
string answer = "";
unordered_map<string, int> umap;
for (string name : participant) umap[name]++; // umap[name] = 1;
for (string name : completion) umap[name]--; // umap[name] = 0;
for (string name : participant) {
if (umap[name] == 1) answer = name;
}
return answer;
}
크레인 인형뽑기 게임
행과 열에 주의할 것,,,
#include <iostream>
#include <string>
#include <vector>
#include <stack>
using namespace std;
int solution(vector<vector<int>> board, vector<int> moves) {
int answer = 0;
int now = 0;
int i;
stack<int> st;
st.push(0);
for (int move : moves) {
for (i = 0; i < board.size(); i++) {
now = board[i][move - 1];
if (now) {
if (now == st.top()) {
st.pop();
answer += 2;
}
else {
st.push(now);
}
board[i][move - 1] = 0;
break;
}
}
}
return answer;
}
실패율
#include <iostream>
#include <string>
#include <vector>
#include <algorithm> // sort
#define MAX 501
using namespace std;
long long enteredPlayers[MAX]; // 각 스테이지에 도전한 플레이어의 수
long long failedPlayers[MAX]; // 각 스테이지 별 클리어하지 못한 플레이어의 수
bool comp(int a, int b) {
if (enteredPlayers[a] * failedPlayers[b] == enteredPlayers[b] * failedPlayers[a]) {
return a < b;
}
else {
return enteredPlayers[a] * failedPlayers[b] < enteredPlayers[b] * failedPlayers[a];
}
}
vector<int> solution(int N, vector<int> stages) {
vector<int> answer;
int size, cnt, i;
size = stages.size();
sort(stages.begin(), stages.end());
cnt = 0;
for (i = 0; i <= N; i++) enteredPlayers[i] = N; // init
for (i = 0; i < size; i++) failedPlayers[stages[i]]++; // init
for (i = 1; i <= N; i++) { // 각 스테이지에 도전한 플레이어의 수 계산
enteredPlayers[i] = size - cnt;
cnt += failedPlayers[i]; // cnt: 스테이지에 실패한 플레이어의 누적 합
}
for (i = 1; i <= N; i++) answer.push_back(i); // 각 스테이지의 번호를 정렬해야 하기 떄문에..!
sort(answer.begin(), answer.end(), comp);
return answer;
}
비밀지도
비트셋으로 편하게 풀었다 😆
#include <iostream>
#include <string>
#include <vector>
#include <bitset>
#include <algorithm> // replace
#define MAX 16
using namespace std;
vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
vector<string> answer;
int i;
for (i = 0; i < n; i++) {
bitset<MAX> map(arr1[i] | arr2[i]);
string str = map.to_string();
str = str.substr(str.size() - n);
replace(str.begin(), str.end(), '0', ' ');
replace(str.begin(), str.end(), '1', '#');
answer.push_back(str);
}
return answer;
}
신규 아이디 추천
2021 카카오 블라인드 채용문제. 공식 해설 여기
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(string new_id) {
string answer = "";
vector<char> v;
int i;
for (i = 0; i < new_id.size(); i++) { // 1단계
char now = new_id[i];
if ('A' <= now && now <= 'Z') new_id[i] = tolower(now);
}
for (char now : new_id) { // 2단계
if (('a' <= now && now <= 'z') || ('0' <= now && now <= '9') ||
now == '-' || now == '_' || now == '.') v.push_back(now);
}
for (i = 1; i < v.size(); i++) { // 3단계
if (v[i] == '.' && v[i - 1] == '.') {
v.erase(v.begin() + i, v.begin() + i + 1);
i--;
}
}
if (v[0] == '.') v[0] = '`'; // 4단계
if (v.back() == '.') v.back() = '`';
v.erase(remove(v.begin(), v.end(), '`'), v.end());
if (v.size() == 0) v.push_back('a'); // 5단계
if (v.size() > 15) { // 6단계
if (v[14] == '.') v.erase(v.begin() + 14, v.end());
else v.erase(v.begin() + 15, v.end());
}
if (v.size() < 3) { // 7단계
char last = v.back();
while (v.size() != 3) v.push_back(last);
}
for (i = 0; i < v.size(); i++) answer += v[i];
return answer;
}
키패드 누르기
2020 카카오 인턴십 문제. 공식 해설은 여기
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int calcDist(int a, int b) {
if (a == 0) a = 11;
if (b == 0) b = 11;
int dist = abs(a - b) / 3 + abs(a - b) % 3; // abs(a-b)/3: 세로로 이동, abs(a-b)%3: 가로로 이동
return (dist > 0 ? dist : -dist);
}
string solution(vector<int> numbers, string hand) {
string answer = "";
int left = 10, right = 12;
for (int number : numbers) {
if (number % 3 == 1) { // 1, 4, 7
left = number;
answer += 'L';
}
else if (number % 3 == 0 && number != 0) { // 3, 6, 9
right = number;
answer += 'R';
}
else {
int ldist = calcDist(left, number);
int rdist = calcDist(right, number);
if (ldist < rdist) {
left = number;
answer += 'L';
}
else if (ldist > rdist) {
right = number;
answer += 'R';
}
else { // ldist == rdist
if (hand == "left") {
left = number;
answer += 'L';
}
else {
right = number;
answer += 'R';
}
}
}
}
return answer;
}
다트 게임
#include <iostream>
#include <string>
#include <cmath> // pow
#include <sstream> // stringstream
using namespace std;
int solution(string dartResult) {
int answer = 0;
int idx = -1;
int size = dartResult.size();
int arr[3] = { 0, 0, 0 };
int i;
for (i = 0; i < size; i++) {
char now = dartResult[i];
if (now == 'S' || now == 'D' || now == 'T') { // 보너스
if (now == 'D') arr[idx] *= arr[idx];
else if (now == 'T') arr[idx] = pow(arr[idx], 3);
}
else if (now == '*') { // 옵션 1: 스타상
if (idx > 0) arr[idx - 1] *= 2;
arr[idx] *= 2;
}
else if (now == '#') { // 옵션 2: 아차상
arr[idx] *= -1;
}
else if ('0' <= now && now <= '9') { // 점수
idx++;
if (now == '1' && i < size - 1 && dartResult[i + 1] == '0') {
arr[idx] = 10;
i++;
}
else arr[idx] = now - '0';
}
}
for (i = 0; i < 3; i++) answer += arr[i];
return answer;
}
// 출처: https://programmers.co.kr/learn/courses/30/lessons/17682/solution_groups?language=cpp
int solution2(string dartResult) {
stringstream ss(dartResult); // 입력받은 문자열에서 ' '와 '\n'을 제외하고 머지 자료들 중 받는 데이터의 자료형으로 꺼내올 수 있도록 함
int sum[3] = { 0, 0, 0 };
int options[3] = { 1, 1, 1 };
int i;
for (i = 0; i < 3; i++) {
int score;
char bonus, option;
ss >> score;
bonus = ss.get(); // ss에서 bonus를 가져옴
option = ss.get(); // ss에서 option을 가져옴
if (option != '*' && option != '$') ss.unget(); // option을 다시 ss에 넣음
switch (bonus) {
case 'S':
sum[i] += pow(score, 1);
break;
case 'D':
sum[i] += pow(score, 2);
break;
case 'T':
sum[i] += pow(score, 3);
break;
default:
break;
}
switch (option) {
case '*':
if (i > 0 && options[i - 1]) options[i - 1] *= 2;
options[i] *= 2;
break;
case '#':
options[i] = -options[i];
break;
default:
break;
}
}
return sum[0] * options[0] + sum[1] * options[1] + sum[2] * options[2];
}
소수 만들기
#include <vector>
#include <cstring> // memset
#define MAX 3000 // 1000 + 1000 + 1000
using namespace std;
bool isPrime[MAX + 1];
void findPrime() {
int i, j;
memset(isPrime, true, sizeof(isPrime));
isPrime[0] = false;
isPrime[1] = false;
for (i = 2; i * i <= MAX; i++) {
if (isPrime[i]) {
for (j = 2; i * j <= MAX; j++) {
isPrime[i * j] = false;
}
}
}
}
int solution(vector<int> nums) {
int answer = 0;
int size = nums.size();
int i, j, k;
findPrime();
for (i = 0; i < size; i++) {
for (j = i + 1; j < size; j++) {
for (k = j + 1; k < size; k++) {
int n = nums[i] + nums[j] + nums[k];
if (isPrime[n]) answer++;
}
}
}
return answer;
}
폰켓몬
#include <vector>
#include <cstring> // memset
#define MAX 200001
using namespace std;
int solution(vector<int> nums) {
bool hasType[MAX];
int size = nums.size();
int cnt = 0;
int i;
memset(hasType, false, sizeof(hasType));
for (i = 0; i < size; i++) hasType[nums[i]] = true;
for (i = 1; i < MAX; i++) {
if (hasType[i]) cnt++;
}
return size / 2 > cnt ? cnt : size / 2;
}
로또의 최고 순위와 최저 순위
#include <vector>
#include <algorithm> // sort
using namespace std;
int getRank(int n) {
switch (n) {
case 6:
return 1;
case 5:
return 2;
case 4:
return 3;
case 3:
return 4;
case 2:
return 5;
default:
return 6;
}
}
vector<int> solution(vector<int> lottos, vector<int> win_nums) {
vector<int> answer;
int lottoIdx = 0, winIdx = 0;
int cnt = 0, zeros = 0;
int i, j;
sort(lottos.begin(), lottos.end());
sort(win_nums.begin(), win_nums.end());
for (i = 0; i < 6; i++) { // lottos
if (lottos[i] == 0) zeros++;
for (j = 0; j < 6; j++) { // win_nums
if (lottos[i] == win_nums[j]) cnt++;
}
}
answer.push_back(getRank(zeros + cnt));
answer.push_back(getRank(cnt));
return answer;
}