문제 설명

문자열 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

 

문제 설명

두 수의 최소공배수(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;
}

+ Recent posts