문제 설명

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.
예를들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.

제한 조건
  • s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.

입출력 예

s return
"1 2 3 4" "1 4"
"-1 -2 -3 -4" "-4 -1"
"-1 -1" "-1 -1"

코드

#include <string>
#include <sstream>
#include <vector>

using namespace std;

string solution(string s) 
{
    string answer = "";
    int min,max,num;
    string word;
    istringstream input(s);
    
    getline(input, word, ' ');
    min = stoi(word);
    max = min;
    num = 0;
    
    while(getline(input, word, ' '))
    {
        num = stoi(word);  
        if(min > num) min = num;
        if(max < num) max = num;
    }
    
    answer+=(to_string(min))+ " " + (to_string(max));
        
    return answer;
}

참고자료

https://blockdmask.tistory.com/334

 

[C++] to_string 함수에 대해서 (int to string)

안녕하세요. BlockDMask 입니다. 지난번에는 string을 int로 변경하는 stoi 함수에 대해서 알아보았습니다. 오늘은 int를 string으로 변경하는 to_string 함수에 대해서 알아보겠습니다. (string -> int 로 변..

blockdmask.tistory.com

https://greenapple16.tistory.com/219

 

[C++] 문자열(string)을 특정 문자로 자르기

문자열을 sstream을 사용하여 특정 문자열로 구분하여 자르기 아래 코드는 공백 문자를 기준으로 자르는 방법 #include #include #include using namespace std; int main() { string fruit = "apple lemon grape..

greenapple16.tistory.com

 


문제 설명

2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.

제한 조건
  • 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
  • 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
  • 곱할 수 있는 배열만 주어집니다.

입출력 예

arr1 arr2 return
[[1, 4], [3, 2], [4, 1]] [[3, 3], [3, 3]] [[15, 15], [15, 15], [15, 15]]
[[2, 3, 2], [4, 2, 4], [3, 1, 4]] [[5, 4, 3], [2, 4, 1], [3, 1, 1]] [[22, 22, 11], [36, 28, 18], [29, 20, 14]]

코드

vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) 
{
    // arr1의 행,열
    int row_count1 = arr1.size();
    int col_count1 = arr1[0].size();
    
    // arr2의 열
    int col_count2 = arr2[0].size();
    
    // 2*3행렬 * 3*5행렬 = 2*5행렬
    vector<vector<int>> answer(row_count1, vector<int>(col_count2));
    
    int dump = 0;
    
    for(int k = 0; k < col_count2; k++)
    {
        for(int i = 0 ; i < row_count1; i++)
        {
            for(int j = 0; j < col_count1; j++)
            {
                 dump+=arr1[i][j]*arr2[j][k];
            }
            answer[i][k] = dump;
            dump=0;
        }
    }
    
    return answer;
}

 

문제 설명

두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요.

제한 사항
  • arr은 길이 1이상, 15이하인 배열입니다.
  • arr의 원소는 100 이하인 자연수입니다.

입출력 예

[2,6,8,14] 168
[1,2,3] 6

최대공약수

<유클리드 호제법>

2개의 자연수의 최대공약수를 구하는 알고리즘.

2개의 자연수 a,b에 대해서 a를 b로 나눈 나머지를 c라고 하면(단,a>b), a와 b의 최대 공약수는 b와 c의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지를 구하고, 이 과정을 반복하여 나머지가 0이 되었을때 나누는 수가 a와 b의 최대공약수이다.  

int GCD(int a, int b)
{
	int c;
	while (b != 0)
	{
		c = a % b;
		a = b;
		b = c;
	}
	return a;
}

 

최소공배수

a * b = GCD(a, b) * LCM(a, b)

-> LCM(a,b) = GCD(a,b) / a*b

int LCM(int a, int b)
{
	return a * b / GCD(a, b);
}

코드

//최대 공약수
int GCD(int a, int b)
{
	int c;
	while (b != 0)
	{
		c = a % b;
		a = b;
		b = c;
	}
	return a;
}

//최소 공배수
int LCM(int a, int b)
{
	return a * b / GCD(a, b);
}

int solution(vector<int> arr) 
{
	int answer = arr[0];

	for (int i = 1; i < arr.size(); i++)
	{
		answer = LCM(arr[i], answer);
	}
	return answer;
}

문제 설명

길이가 같은 배열 A, B 두개가 있습니다. 각 배열은 자연수로 이루어져 있습니다.
배열 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱합니다. 이러한 과정을 배열의 길이만큼 반복하며, 두 수를 곱한 값을 누적하여 더합니다. 이때 최종적으로 누적된 값이 최소가 되도록 만드는 것이 목표입니다. (단, 각 배열에서 k번째 숫자를 뽑았다면 다음에 k번째 숫자는 다시 뽑을 수 없습니다.)

예를 들어 A = [1, 4, 2] , B = [5, 4, 4] 라면

  • A에서 첫번째 숫자인 1, B에서 첫번째 숫자인 5를 뽑아 곱하여 더합니다. (누적된 값 : 0 + 5(1x5) = 5)
  • A에서 두번째 숫자인 4, B에서 세번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 5 + 16(4x4) = 21)
  • A에서 세번째 숫자인 2, B에서 두번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 21 + 8(2x4) = 29)

즉, 이 경우가 최소가 되므로 29를 return 합니다.

배열 A, B가 주어질 때 최종적으로 누적된 최솟값을 return 하는 solution 함수를 완성해 주세요.

 

제한사항

  • 배열 A, B의 크기 : 1,000 이하의 자연수
  • 배열 A, B의 원소의 크기 : 1,000 이하의 자연수

입출력 예

[1, 4, 2] [5, 4, 4] 29
[1,2] [3,4] 10

코드

#include <algorithm>

int solution(vector<int> A, vector<int> B)
{
    int answer = 0;

    sort(A.begin(), A.end());                 // 오름차순 정렬
    sort(B.begin(), B.end(), greater<int>()); // 내림차순 정렬
    
    for(int i = 0; i < A.size(); i++)
    {
        answer += A[i] * B[i] ;
    }
    
    return answer;
}

문제 설명

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

  • "()()" 또는 "(())()" 는 올바른 괄호입니다.
  • ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

 

제한사항

  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

 

입출력 예

"()()" true
"(())()" true
")()(" false
"(()(" false

코드#1

bool solution(string s)
{
    bool answer = false;
    int size = s.size();
    int check = 0;
    
    for(int i = 0 ; i< size; i++)
    {
        if(s[i] == '(')  check++;
        if(check > 0)
        {
            if(s[i] == ')')  check--;
        }
    }
    
    //첫 시작이'(' , 끝이 ')'
    if(check == 0 && s[0] == '(' && s[size-1] == ')') answer = true;
    
    return answer;
}

코드#2 : Stack 활용

#include <stack>

bool solution(string s)
{
    stack <char> stk;
    bool answer = false;
    int size = s.size();
    
    for(int i = 0; i < size; i++)
    {
        if(s[i] == '(') stk.push(s[i]);
        else 
        {
            if(!stk.empty() && stk.top() == '(') stk.pop();
            else                                 stk.push(s[i]);
        }
    }
    
    if(stk.empty()) answer = true;

    return answer;
}

문제 설명

피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다.

예를들어

  • F(2) = F(0) + F(1) = 0 + 1 = 1
  • F(3) = F(1) + F(2) = 1 + 1 = 2
  • F(4) = F(2) + F(3) = 1 + 2 = 3
  • F(5) = F(3) + F(4) = 2 + 3 = 5

와 같이 이어집니다.

2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요.

 

제한 사항

  • n은 2 이상 100,000 이하인 자연수입니다.

 

입출력 예

3 2
5 5

입출력 예 설명

피보나치수는 0번째부터 0, 1, 1, 2, 3, 5, ... 와 같이 이어집니다.


코드

int solution(int n) {
    int fibo[100001];
    int answer = 0;
    
    fibo[0] = 0;
    fibo[1] = 1;
    
    for(int i = 2 ; i<= n; i++)
    {
        fibo[i] = fibo[i-1] + fibo[i-2];
        fibo[i] = fibo[i] % 1234567;
    }
    
    answer = fibo[n];
    
    return answer;
}

문제 설명

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

  • 1478 → "one4seveneight"
  • 234567 → "23four5six7"
  • 10203 → "1zerotwozero3"

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

숫자영단어

0 zero
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine

 

제한사항

  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

입출력 예

"one4seveneight" 1478
"23four5six7" 234567
"2three45sixseven" 234567
"123" 123

코드

int solution(string s) {
    int answer = 0;
    string dump = "";
    int size = s.size();

    for (int i = 0; i < size; i++)
    {
        if (s[i] >= '0' && s[i] <= '9') dump.push_back(s[i]);
        if (s.find("zero", i)  == i)    dump.push_back('0');
        if (s.find("one", i)   == i)    dump.push_back('1');
        if (s.find("two", i)   == i)    dump.push_back('2');
        if (s.find("three", i) == i)    dump.push_back('3');
        if (s.find("four", i)  == i)    dump.push_back('4');
        if (s.find("five", i)  == i)    dump.push_back('5');
        if (s.find("six", i)   == i)    dump.push_back('6');
        if (s.find("seven", i) == i)    dump.push_back('7');
        if (s.find("eight", i) == i)    dump.push_back('8');
        if (s.find("nine", i)  == i)    dump.push_back('9');
    }

    answer = stoi(dump);

    return answer;
}
더보기

str1.find(....)

함수 원형 : size_t find (const string& str, size_t index = 0) const;

함수 원형 : size_t find (const char* arr, size_t index = 0) const;

함수 설명 : 매개변수로 들어온 문자열과, 내 문자열중에 일치하는 게 있는지 확인하는 함수입니다.  

만약에 일치하는게 있다면, 일치하는 부분의 첫번째 순서(index)를 반환합니다. 

두번째 매개변수로 들어온 index는 어느 위치에서 부터 찾을까 입니다.

함수 예시 : str2.find("Blog");         // "BlogBlogBlogBlog" -> 0 을 반환합니다.

함수 예시 : str2.find("Blog", 5);    // 5번째 인자부터 blog를 찾게되니 BlogBlogBlogBlog 빨간색 l에서부터 찾게되므로 그 다음에 나오는 B의 위치인 8을 반환할 것 입니다.

출처: https://blockdmask.tistory.com/338 [개발자 지망생]

+ Recent posts