1. 목표
A. 프로그래머스 코테 문제 1단계 10문제 풀기
B. Hash table
2. 프로그래머스 코테 문제 1단계 10문제
- 문자열을 정수로 바꾸기 https://programmers.co.kr/learn/courses/30/lessons/12925
- 내적 https://programmers.co.kr/learn/courses/30/lessons/70128
- 이상한 문자 만들기 https://programmers.co.kr/learn/courses/30/lessons/12930
- 자연수 뒤집어 배열로 만들기 https://programmers.co.kr/learn/courses/30/lessons/12932
- 정수 제곱근 판별 https://programmers.co.kr/learn/courses/30/lessons/12934
- 짝수와 홀수 https://programmers.co.kr/learn/courses/30/lessons/12937
- 최대공약수와 최소공배수 https://programmers.co.kr/learn/courses/30/lessons/12940
- 평균 구하기 https://programmers.co.kr/learn/courses/30/lessons/12944
- 핸드폰 번호 가리기 https://programmers.co.kr/learn/courses/30/lessons/12948
- x만큼 간격이 있는 n개의 숫자 https://programmers.co.kr/learn/courses/30/lessons/12954
A. 문자열을 정수로 바꾸기
#include <string>
#include <vector>
using namespace std;
int solution(string s) {
int answer = 0;
answer = stoi(s);
return answer;
}
- string 클래스 내부의 stoi 함수를 활용하여 입력받은 s string 값을 int 형으로 변환하여 반환한다.
- stoi 함수는 입력으로 string 변수를 받는데, string 값의 일부만 인덱스를 활용하여 입력하는 건 불가능해보인다. string 값의 일부만 stoi 함수를 활용하여 int 형으로 변환할 방안을 찾아봐야 할 듯.
B. 내적
#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;
}
- 같은 index에 해당하는 값을 곱하여 곱한 값들을 모두 더한 뒤 반환해야 한다.
- for loop를 활용하여 같은 index의 값끼리 곱하게 하였고, 곱한 값을 answer 변수에 계속 더하도록 하였다.
C. 이상한 문자 만들기
#include <string>
#include <vector>
using namespace std;
string solution(string s) {
string answer = "";
int char_tmp = 0;
for (int i = 0; i < s.size(); i++)
{
if (isalpha(s[i]))
{
if (char_tmp % 2 == 0)
{
if (!(isupper(s[i])))
s[i] -= 32;
}
else
{
if (isupper(s[i]))
s[i] += 32;
}
char_tmp++;
}
else
char_tmp = 0;
}
answer = s;
return answer;
}
- 공백을 제외하고 문자에서의 index만 계산하여 짝수 홀수를 구분해야하므로 char_tmp 변수를 두고 공백을 만났을 때 0으로 초기화 하도록 함
- string 값이 문자일 경우, 짝홀을 구분하여 아스키 계산을 통해 소문자 또는 대문자로 변환하도록 함.
D. 자연수 뒤집어 배열로 만들기
#include <string>
#include <vector>
using namespace std;
vector<int> solution(long long n) {
vector<int> answer;
int tmp = 1;
for (int i = 0; n != 0; i++)
{
answer.push_back(n % 10);
n /= 10;
}
return answer;
}
- 입력된 n에서 10으로 나눈 나머지를 answer vector 변수에 차곡차곡 넣도록 함.
E. 정수 제곱근 판별
#include <string>
#include <vector>
using namespace std;
long long solution(long long n) {
long long answer = 0;
for (long long i = 0 ; i * i <= n; i++)
{
if (i * i == n)
{
answer = (i + 1) * (i + 1);
break;
}
}
if (answer == 0)
answer = -1;
return answer;
}
- i의 제곱이 n이 될 때까지 for loop를 돌렸고, for loop 내부에서 n의 제곱근인 i를 조건문을 통해 발견했을 경우, i + 1를 제곱하여 answer에 입력하도록 한다.
- for loop가 끝난 후 answer가 0이란 의미는 for loop 내부에서 n에 대한 제곱근을 못찾았다는 것이고 answer에 -1을 입력하여 return하도록 한다.
- 일부 case에서 오류가 발생하였는데, long long 형인 n과 비교하는 i를 int 형으로 선언하여 오류가 발생했다.
F. 짝수와 홀수
#include <string>
#include <vector>
using namespace std;
string solution(int num) {
string answer = "";
if (num % 2 == 0)
answer += "Even";
else
answer += "Odd";
return answer;
}
- 입력받은 num을 2로 나눈 나머지가 0이면 짝수라는 것을 이용해서 조건문을 구성한다.
G. 최대공약수와 최소공배수
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int n, int m) {
vector<int> answer;
int result = 1;
int tmp = (n > m) ? m : n;
for (int i = 1; i <= tmp; i++)
{
if (n % i == 0 && m % i == 0)
result = i;
}
answer.push_back(result);
result = (n * m) / result;
answer.push_back(result);
return answer;
}
- 삼항연산자를 통해 입력받은 n과 m의 대소관계를 판단하여 작은 수를 tmp에 입력한다.
- for loop를 tmp번 동작하게 하고 for loop 내부에서 n과 m이 둘다 나누어 떨어지는 i 값을 구하여 result에 입력한다.
- 입력된 result는 answer vector에 차곡차곡 넣는다.
- result 값을 n과 m을 곱한 값에 기존의 result 값을 나눈 결과값으로 갱신한다.
- 갱신된 result 값을 answer vector에 넣는다.
H. 평균 구하기
#include <string>
#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];
answer /= i;
return answer;
}
- for loop를 통해 배열에 있는 값을 모두 더했고, for loop 동작 횟수 i로 나누어 평균을 구하였다.
I. 핸드폰 번호 가리기
#include <string>
#include <vector>
using namespace std;
string solution(string phone_number) {
string answer = "";
for (int i = 0; i < phone_number.size(); i++)
{
if (i > (int)phone_number.size() - 5)
answer += phone_number[i];
else if (i <= (int)phone_number.size() - 5)
answer += '*';
}
return answer;
}
- for loop 내부에서 증가하는 i 값이 입력받은 string 값의 크기에 5를 뺀 값보다 클 경우에만 phone_number를 answer string 변수에 더하도록 하여 phone_number 뒷 4자리만 표현되도록 하였다.
- 그 외의 경우는 answer에 *을 더해주었다.
- 일부 케이스에서 오류가 발생하였는데 string 변수에 size 함수를 활용하여 변수의 크기를 return 하였을 때, return된 값은 size_t 형이다. size_t형에 int형인 i를 비교하여 오류가 발생한 것이었고 반환된 size_t형을 (int)를 활용하여 int형으로 바꾸었다.
J. x만큼 간격이 있는 n개의 숫자
#include <string>
#include <vector>
using namespace std;
vector<long long> solution(int x, int n) {
vector<long long> answer;
int tmp = x;
for (int i = 0; i < n; i++)
{
answer.push_back(x);
x += tmp;
}
return answer;
}
- for loop를 n번 돌려 n개의 숫자를 맞춰준다.
- for loop를 통해 x로 초기화된 tmp를 x에 계속 더해주고 answer vector에 차곡차곡 쌓아준다.
3. Hash table