1. 목표
A. 프로그래머스 코테 문제 1단계 10문제 풀기
2. 프로그래머스 코테 문제 1단계 10문제
- 수박수박수박수박수박수? https://programmers.co.kr/learn/courses/30/lessons/12922
- 시저 암호 https://programmers.co.kr/learn/courses/30/lessons/12926
- 약수의 합 https://programmers.co.kr/learn/courses/30/lessons/12928
- 자릿수 더하기 https://programmers.co.kr/learn/courses/30/lessons/12931
- 정수 내림차순으로 배치하기 https://programmers.co.kr/learn/courses/30/lessons/12933
- 제일 작은 수 제거하기 https://programmers.co.kr/learn/courses/30/lessons/12935
- 키패드 누르기 https://programmers.co.kr/learn/courses/30/lessons/67256
- 콜라츠 추측 https://programmers.co.kr/learn/courses/30/lessons/12943
- 하샤드 수 https://programmers.co.kr/learn/courses/30/lessons/12947
- 행렬의 덧셈 https://programmers.co.kr/learn/courses/30/lessons/12950
A. 수박수박수박수박수박수?
#include <string>
#include <vector>
using namespace std;
string solution(int n) {
string answer = "";
for (int i = 0; i < n; i++)
{
if (i % 2 == 0)
answer += "수";
else
answer += "박";
}
return answer;
}
- 패턴을 파악한 결과, 짝수 인덱스에는 '수'가 들어가고 홀수 인덱스에는 '박'이 들어간다.
- for loop를 통해 짝수 인덱스일 때에는 answer string 변수에 "수"를 더해줬고, 홀수 인덱스일 때에는 "박"을 더해줬다.
B. 시저 암호
#include <string>
#include <vector>
using namespace std;
string solution(string s, int n) {
string answer = "";
for (int i = 0; i < s.size(); i++)
{
if (isalpha(s[i]))
{
if (!(isupper(s[i])))
{
if (s[i] + n > 'z')
answer += (s[i] - (26 - n));
else
answer += (s[i] + n);
}
else
{
if (s[i] + n > 'Z')
answer += (s[i] - (26 - n));
else
answer += (s[i] + n);
}
}
else
answer += s[i];
}
return answer;
}
- for loop를 통해 s 값이 알파벳인지 확인한다.
- 알파벳일 경우, 대소문자를 구분하여 n만큼 더한 값이 'z'보다 큰지, 'Z'보다 큰지 확인한다.
- 클 경우, 초과한만큼 'a' 또는 'A'로 돌아가서 다시 더해준다.
- 알파벳이 아닐 경우, 그대로 answer string 변수에 더해준다.
- string 값에 n만큼 더한 값이 alpha인지 확인할 때, 소문자 일 수도 있어서 예상치 못한 오류가 발생할 수 있음.
C. 약수의 합
#include <string>
#include <vector>
using namespace std;
int solution(int n) {
int answer = 0;
int i;
for (i = 1; i * i <= n; i++)
{
if (n % i == 0)
{
if (!(i * i == n))
answer += (n / i);
answer += i;
}
}
return answer;
}
- 0부터 인자로 받은 n의 제곱근까지 for loop를 돌린다.
- for loop에서 증가하는 i 값을 n에 지속적으로 나누어 주고 나누어 떨어질 경우, answer에 int로 더해준다.
D. 자릿수 더하기
#include <iostream>
using namespace std;
int solution(int n)
{
int answer = n % 10;
int tmp = 10;
while (0 != n / tmp)
{
answer += (n / tmp) % 10;
tmp *= 10;
}
return answer;
}
- answer를 n을 10으로 나눈 나머지 값으로 초기화해준다.
- while 문을 통해 자리마다 값을 뽑아준다.
- 뽑은 값을 answer에 계속 더해준다.
E. 정수 내림차순으로 배치하기
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
long long solution(long long n) {
long long answer = 0;
vector<int> tmp;
int int_tmp2;
int int_tmp = 1;
while (n != 0)
{
tmp.push_back(n % 10);
n /= 10;
}
sort(tmp.begin(), tmp.end(), greater<int>()); // less는 오름차순
for (int i = tmp.size() - 1; i >= 0; i--)
{
answer += tmp[i] * int_tmp;
int_tmp *= 10;
}
return answer;
}
- while문을 통해 n으로 입력받은 int형을 각 자리수마다 나누어 tmp vector 변수에 넣어준다.
- tmp vector 함수를 sort함수를 활용하여 정렬한다.(매개변수로 넣는 값에 따라서 정렬방식이 결정됨, 아무것도 입력되지 않을 경우, 오름차순 정렬)
- 정렬된 tmp vector를 for loop를 통해 다시 int 값으로 변환한다.(라이브러리 함수가 있을듯)
- sort(tmp.begin(), tmp.end(), greater<int>()) : 정렬이 필요한 인덱스에 해당하는 시작 주소와 끝 주소를 매개변수로 입력한다.
- less : 첫번째 인자가 두번째 인자보다 작으면 true 반환, greater : 첫번째 인자가 두번째 인자보다 크면 true 반환
- sort 함수에서 less, greater 함수가 매개변수로 입력될 수 있는데, 추측컨데 sort 함수 내부에서 매개변수로 받은 함수의 반환 값에 따라 정렬이 결정될 것으로 추측
F. 제일 작은 수 제거하기
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> arr) {
vector<int> answer;
int index_tmp;
int min;
if (arr[0] < arr[1])
{
min = arr[0];
index_tmp = 0;
}
else
{
min = arr[1];
index_tmp = 1;
}
for (int i = 2; i < arr.size(); i++)
{
if (min > arr[i])
{
min = arr[i];
index_tmp = i;
}
}
arr.erase(arr.begin() + index_tmp);
if (arr.size() == 0)
answer.push_back(-1);
else
answer = arr;
return answer;
}
- arr의 0과 1 인덱스 값을 비교하여 작은 값으로 min을 초기화시킨다.
- for loop를 통해 arr 값과 min을 비교하여 min을 작은 값으로 갱신한다. 그리고 해당하는 index를 index_tmp에 넣어준다.
- arr 값이 없을 때에는 -1을 리턴시켜주고, erase vector 함수를 활용하여 index_tmp에 있는 값을 삭제한다.
- arr.erase(arr.begin() + index_tmp) : arr의 시작점 주소에 index_tmp만큼 더한 주소 값에 해당하는 값을 삭제하고 메모리를 재할당한 후 남은 값을 다시 채워넣는다.
G. 키패드 누르기
H. 콜라츠 추측
#include <string>
#include <vector>
using namespace std;
int solution(int num) {
int answer = 0;
int tmp = num;
int i;
if (num == 1)
return (0);
for (i = 1; i <= 500; i++)
{
if (tmp % 2 == 0)
tmp = tmp / 2;
else if (tmp % 2 == 1) // 그냥 else로 하면 오류 발생
tmp = (3 * tmp) + 1;
if (tmp == 1)
break;
}
answer = i;
if (answer > 500)
answer = -1;
return answer;
}
- 인자로 받은 num 값이 1일때는 0을 리턴한다.
- for loop를 돌려서 콜라츠 추측대로 홀수 짝수 구분하여 계산하고 1이 될 때 break 하여 for loop를 빠져나온다.
- for loop가 500번 이상 돌아갈 경우, for loop를 종료한다.
- for loop가 종료된 후에 answer가 500을 초과할 경우, -1을 리턴하고 아닐 경우, for loop가 돌아간 횟수를 리턴한다.
- 짝수일 경우에 else를 추가하여 조건문을 구성하였으나 오류가 발생함. else if 로 홀수일경우를 따로 빼주었더니 오류가 없어짐. 오류발생이유는 아직 파악이 안되었음.
I. 하샤드 수
#include <string>
#include <vector>
using namespace std;
bool solution(int x) {
bool answer = true;
int i;
int tmp = 1;
int result = 0;
for (i = 0; x / tmp != 0; i++)
{
result += (x / tmp) % 10;
tmp *= 10;
}
if (x % result != 0)
answer = false;
return answer;
}
- answer를 true로 초기화한다.
- for loop를 통해 x의 각 자리수 합을 result 변수에 넣는다.
- x에 result를 나눈 나머지가 0이 아닐 때 answer에 false를 입력한다.
J. 행렬의 덧셈
#include <string>
#include <vector>
using namespace std;
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
vector<vector<int>> answer;
vector<int> tmp;
for (int i = 0; i < arr1.size(); i++)
{
for (int j = 0; j < arr1[i].size(); j++)
tmp.push_back(arr1[i][j] + arr2[i][j]);
answer.push_back(tmp);
tmp.clear();
}
return answer;
}
- tmp vector를 매개변수로 선언해서 같은 인덱스의 arr1과 arr2를 더한 값을 tmp에 넣어준다.
- tmp vector에 값을 넣을 때마다 answer 2차원 vector 변수에 차곡차곡 넣어준다.