추가 라이브러리 없이 풀기 + 함수 사용하지 않고 풀 수 있는 문제는 그냥 풀기
문제 설명
숫자로만 이루어진 문자열 n_str이 주어질 때, n_str을 정수로 변환하여 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ n_str ≤ 5
n_str은 0부터 9까지의 정수 문자로만 이루어져 있습니다.
#include <string>
#include <vector>
using namespace std;
int solution(string n_str) {
int answer = 0;
int dec = 1;
for(int i = n_str.length() - 1; i >= 0; i--){
answer += (n_str[i] - '0') * dec;
dec *= 10;
}
return answer;
}
📍 stoi() 함수, pow() 함수 사용하지 않고 ASCII 코드로 풀기
문제 설명
정수 n이 주어질 때, n을 문자열로 변환하여 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ n ≤ 10000
#include <string>
#include <vector>
using namespace std;
string solution(int n) {
string answer = "";
string temp = "";
do{
temp += (n%10) + '0';
n /= 10;
} while(n != 0);
for(int i = temp.length() - 1; i >= 0; i--){
answer += temp[i];
}
return answer;
}
📍to_string() 함수 사용하지 않고 ASCII 코드로 풀기
문제 설명
문자열 my_string과 정수 n이 매개변수로 주어질 때, my_string의 앞의 n글자로 이루어진 문자열을 return 하는 solution 함수를 작성해 주세요.
제한사항
my_string은 숫자와 알파벳으로 이루어져 있습니다.
1 ≤ my_string의 길이 ≤ 1,000
1 ≤ n ≤ my_string의 길이
#include <string>
#include <vector>
using namespace std;
string solution(string my_string, int n) {
return my_string.substr(0, n);
}
📍 가끔 substr을 까먹어서 풀어줌
문제 설명
알파벳으로 이루어진 문자열 myString이 주어집니다. 모든 알파벳을 소문자로 변환하여 return 하는 solution 함수를 완성해 주세요.
제한사항
1 ≤ myString의 길이 ≤ 100,000
myString은 알파벳으로 이루어진 문자열입니다.
#include <string>
#include <vector>
using namespace std;
string solution(string myString) {
string answer = "";
for(char c : myString){
answer += tolower(c);
}
return answer;
}
📍 tolower(char) 형태, toupper(char)도 마찬가지로 한 문자씩 변환해야함
ASCII 코드를 이용할 경우 'A'+32 = 'a'
문제 설명
문자열들이 담긴 리스트가 주어졌을 때, 모든 문자열들을 순서대로 합친 문자열을 꼬리 문자열이라고 합니다. 꼬리 문자열을 만들 때 특정 문자열을 포함한 문자열은 제외시키려고 합니다. 예를 들어 문자열 리스트 ["abc", "def", "ghi"]가 있고 문자열 "ef"를 포함한 문자열은 제외하고 꼬리 문자열을 만들면 "abcghi"가 됩니다.
문자열 리스트 str_list와 제외하려는 문자열 ex가 주어질 때, str_list에서 ex를 포함한 문자열을 제외하고 만든 꼬리 문자열을 return하도록 solution 함수를 완성해주세요.
제한사항
2 ≤ str_list의 길이 ≤ 10
1 ≤ str_list의 원소의 길이 ≤ 10
1 ≤ ex의 길이 ≤ 5
#include <string>
#include <vector>
using namespace std;
string solution(vector<string> str_list, string ex) {
string answer = "";
for(string s : str_list){
if(s.find(ex) == string::npos){
answer += s;
}
}
return answer;
}
📍 string.find(string)
문자열 내부에 찾고자하는 문자열이 존재하면 시작 주솟값 반환, 없으면 string::npos
반환
문제 설명
정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다.
"w" : n이 1 커집니다.
"s" : n이 1 작아집니다.
"d" : n이 10 커집니다.
"a" : n이 10 작아집니다.
위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.
제한사항
-100,000 ≤ n ≤ 100,000
1 ≤ control의 길이 ≤ 100,000
control은 알파벳 소문자 "w", "a", "s", "d"로 이루어진 문자열입니다.
#include <string>
#include <vector>
#include <map>
using namespace std;
int solution(int n, string control) {
map<char, int> con;
con['w'] = 1;
con['s'] = -1;
con['d'] = 10;
con['a'] = -10;
for(char c : control){
n += con[c];
}
return n;
}
📍 굳이 map을 쓸 필요는 없긴 하지만 깔끔한 코드를 위해
문제 설명
단어가 공백 한 개로 구분되어 있는 문자열 my_string이 매개변수로 주어질 때, my_string에 나온 단어를 앞에서부터 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.
제한사항
my_string은 영소문자와 공백으로만 이루어져 있습니다.
1 ≤ my_string의 길이 ≤ 1,000
my_string의 맨 앞과 맨 뒤에 글자는 공백이 아닙니다.
#include <string>
#include <vector>
using namespace std;
vector<string> solution(string my_string) {
vector<string> answer;
int now = 0;
int position = my_string.find(' ');
while(position != string::npos){
answer.push_back(my_string.substr(now, position - now));
now = position + 1;
position = my_string.find(' ', now);
}
answer.push_back(my_string.substr(now));
return answer;
}
📍 다양한 풀이법이 있는데, substr와 find를 이용하여 풀었다.
다른 풀이로는 정규식(regex), 스트림, getline, char 비교 등이 있다.
❔sstream을 이용한 코드
#include <string>
#include <vector>
#include <sstream>
using namespace std;
vector<string> solution<string my_string) {
vector<string> answer;
string str;
stringstream ss;
ss.str(my_string);
while(ss >> str) {
answer.emplace_back(str);
}
return answer;
}
stringstream
: 공백과 \n을 제외하고 문자열에서 필요한 자료형에 맞는 정보를 꺼냄
ss.str(my_string)
: 현재 stream ss의 값을 my_string으로 변경
emplace_back()
: push_back()
보다 성능상 좋음!!
문제 설명
문자열 binomial이 매개변수로 주어집니다. binomial은 "a op b" 형태의 이항식이고 a와 b는 음이 아닌 정수, op는 '+', '-', '*' 중 하나입니다. 주어진 식을 계산한 정수를 return 하는 solution 함수를 작성해 주세요.
제한사항
0 ≤ a, b ≤ 40,000
0을 제외하고 a, b는 0으로 시작하지 않습니다.
#include <string>
#include <vector>
#include <sstream>
using namespace std;
int solution(string binomial) {
stringstream ss;
ss.str(binomial);
int a, b;
char op;
ss >> a >> op >> b;
if(op == '+') return a + b;
if(op == '-') return a - b;
if(op == '*') return a * b;
}
📍 입력 형식이 정해져있을때는 while문을 사용하지 않고 바로 >>를 이용해서 값을 타입에 맞는 값을 얻을 수 있다.
문제 설명
1부터 6까지 숫자가 적힌 주사위가 두 개 있습니다. 두 주사위를 굴렸을 때 나온 숫자를 각각 a, b라고 했을 때 얻는 점수는 다음과 같습니다.
a와 b가 모두 홀수라면 a2 + b2 점을 얻습니다.
a와 b 중 하나만 홀수라면 2 × (a + b) 점을 얻습니다.
a와 b 모두 홀수가 아니라면 |a - b| 점을 얻습니다.
두 정수 a와 b가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
제한사항
a와 b는 1 이상 6 이하의 정수입니다.
#include <string>
#include <vector>
#include <cmath>
using namespace std;
int solution(int a, int b) {
if(a%2==1 && b%2==1){
return pow(a, 2) + pow(b, 2);
}
else if(a%2==0 && b%2==0){
return abs(a-b);
}
else{
return 2*(a+b);
}
}
📍 제곱은 pow(a,b)
(a^b), 절댓값은 abs()
abs는 iostream 헤더 파일에 포함되어 있음!
pow는 cmath 포함해야함
절댓값 함수
int type : abs
long type : labs
float type : fabs
문제 설명
알파벳 소문자로 이루어진 문자열 myString이 주어집니다. 알파벳 순서에서 "l"보다 앞서는 모든 문자를 "l"로 바꾼 문자열을 return 하는 solution 함수를 완성해 주세요.
제한사항
1 ≤ myString ≤ 100,000
myString은 알파벳 소문자로 이루어진 문자열입니다.
#include <string>
#include <vector>
using namespace std;
string solution(string myString) {
for(char& c : myString){
if(c < 'l'){
c = 'l';
}
}
return myString;
}
📍 for(auto& a : var)
이런 식으로 하면 주솟값에 접근 가능
문제 설명
정수 리스트 num_list와 정수 n이 주어질 때, num_list를 n 번째 원소 이후의 원소들과 n 번째까지의 원소들로 나눠 n 번째 원소 이후의 원소들을 n 번째까지의 원소들 앞에 붙인 리스트를 return하도록 solution 함수를 완성해주세요.
제한사항
2 ≤ num_list의 길이 ≤ 30
1 ≤ num_list의 원소 ≤ 9
1 ≤ n ≤ num_list의 길이
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<int> num_list, int n) {
vector<int> answer;
for(int i = n; i<num_list.size(); i++){
answer.emplace_back(num_list[i]);
}
for(int i = 0; i<n; i++){
answer.emplace_back(num_list[i]);
}
return answer;
}
📍 사실 내 코드를 올릴 필욘 없었고 다른 사람의 풀이를 보니 벡터 활용을 잘 한 코드가 있길래..
벡터 초기화, insert 함수 이용
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<int> num_list, int n) {
vector<int> answer(num_list.begin(),num_list.begin()+n);
answer.insert(answer.begin(),num_list.begin()+n,num_list.end());
return answer;
}
문제 설명
1부터 6까지 숫자가 적힌 주사위가 세 개 있습니다. 세 주사위를 굴렸을 때 나온 숫자를 각각 a, b, c라고 했을 때 얻는 점수는 다음과 같습니다.
세 숫자가 모두 다르다면 a + b + c 점을 얻습니다.
세 숫자 중 어느 두 숫자는 같고 나머지 다른 숫자는 다르다면 (a + b + c) × (a2 + b2 + c2 )점을 얻습니다.
세 숫자가 모두 같다면 (a + b + c) × (a2 + b2 + c2 ) × (a3 + b3 + c3 )점을 얻습니다.
세 정수 a, b, c가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
제한사항
a, b, c는 1이상 6이하의 정수입니다.
#include <string>
#include <vector>
#include <math.h>
#include <set>
using namespace std;
int solution(int a, int b, int c)
{
set<int> s{a, b, c};
if(s.size() == 3)
return a + b + c;
if(s.size() == 2)
return (a + b + c) * (pow(a, 2) + pow(b, 2) + pow(c, 2));
if(s.size() == 1)
return (a + b + c) * (pow(a, 2) + pow(b, 2) + pow(c,2)) * (pow(a, 3) + pow(b, 3) + pow(c, 3));
}
📍 내 코드는 한없이 초라했다.. 최고의 코드
set은 중복 제거
문제 설명
정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk를 만드려고 합니다.
변수 i를 만들어 초기값을 0으로 설정한 후 i가 arr의 길이보다 작으면 다음 작업을 반복합니다.
만약 stk가 빈 배열이라면 arr[i]를 stk에 추가하고 i에 1을 더합니다.
stk에 원소가 있고, stk의 마지막 원소가 arr[i]보다 작으면 arr[i]를 stk의 뒤에 추가하고 i에 1을 더합니다.
stk에 원소가 있는데 stk의 마지막 원소가 arr[i]보다 크거나 같으면 stk의 마지막 원소를 stk에서 제거합니다.
위 작업을 마친 후 만들어진 stk를 return 하는 solution 함수를 완성해 주세요.
제한사항
1 ≤ arr의 길이 ≤ 100,000
1 ≤ arr의 원소 ≤ 100,000
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<int> arr) {
vector<int> stk;
int i = 0;
while(i < arr.size()){
if(stk.empty()){
stk.emplace_back(arr[i++]);
}
else{
if(stk.back() < arr[i]){
stk.emplace_back(arr[i++]);
}
else{
stk.pop_back();
}
}
}
return stk;
}
📍 vector.front()
: 벡터의 첫번째 요소
vector.back()
: 벡터의 마지막 요소
vector.begin()
: 벡터의 첫번째 요소의 위치(iterator)
vector.end()
: 벡터의 마지막 요소의 위치