[프로그래머스] Level 0

OOING·2023년 7월 7일
0

백준+알고리즘 공부

목록 보기
10/75

추가 라이브러리 없이 풀기 + 함수 사용하지 않고 풀 수 있는 문제는 그냥 풀기

문자열을 정수로 변환하기

문제 설명
숫자로만 이루어진 문자열 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 코드로 풀기

문자열 앞의 n글자

문제 설명
문자열 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 반환

수 조작하기 1

문제 설명
정수 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을 쓸 필요는 없긴 하지만 깔끔한 코드를 위해

공백으로 구분하기 1

문제 설명
단어가 공백 한 개로 구분되어 있는 문자열 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

문제 설명
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

l로 만들기

문제 설명
알파벳 소문자로 이루어진 문자열 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;
}

주사위 게임 2

문제 설명
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중복 제거

배열 만들기 4

문제 설명
정수 배열 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() : 벡터의 마지막 요소의 위치

profile
HICE 19

0개의 댓글