카테고리 없음

프로그래머스 - 코딩 기초 트레이닝 캘린더 Day 7

als982001 2024. 2. 15. 22:31

1. 수열과 구간 쿼리 4

https://school.programmers.co.kr/learn/courses/30/lessons/181922

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> arr, vector<vector<int>> queries) {
    vector<int> answer;
    
    for (int queryIdx = 0; queryIdx < queries.size(); ++queryIdx)
    {
        int s = queries[queryIdx][0];
        int e = queries[queryIdx][1];
        int k = queries[queryIdx][2];
        
        for (int arrIdx = s; arrIdx <= e; ++arrIdx)
        {            
            // 만약 arrIdx가 k의 배수일 경우
            if (arrIdx % k == 0)
                ++arr[arrIdx];  // arr[arrIdx]에 1을 더한다.
        }
    }
    
    answer = arr;
    
    return answer;
}

 

 이 문제는 queries를 탐색하는 반복문과, s ~ e 사이를 탐색하는 반복문을 합한 이중 반복문을 이용하여 답을 구할 수 있다.

 


 

2. 배열 만들기 2

https://school.programmers.co.kr/learn/courses/30/lessons/181921

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int l, int r) {
    vector<int> answer;
    
    for (int num = l; num <= r; ++num)
    {
        bool success = true;
        
        int tempNum = num;
        
        while(tempNum > 0 && success == true)
        {
            int r = tempNum % 10;
            tempNum /= 10;
            
            if (r != 0 && r != 5)
                success = false;
        }
        
        if (success)
            answer.push_back(num);
    }
    
    // 만약 문제의 조건을 충족하는 정수가 없을 경우, -1이 담긴 배열을 return한다.
    if (answer.size() == 0)
        return { -1 };
    
    return answer;
}

 

 주어진 l과 r 사이의 숫자 중, 0과 5로만 이루어진 숫자들을 구하는 문제이다. 여러가지 방법이 있겠지만, 이 문제는 l과 r 사이의 숫자, num을 10으로 나눈 나머지를 일일이 검사하는 것으로 조건을 충족하는 숫자를 구하였다. 예를 들어, 123이라는 숫자를 10으로 나눈 나머지는 3이다. 그리고 123을 10으로 나누면 12가 된다. 그리고 다시 12를 10으로 나눈 나머지는 2이고, 12를 10으로 나누면 1이 된다. 이러한 과정을 거쳐 조건을 충족하는 숫자를 구할 수 있다.

 


 

3. 카운트 업

https://school.programmers.co.kr/learn/courses/30/lessons/181920

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int start_num, int end_num) {
    vector<int> answer;
    
    for (int num = start_num; num <= end_num; ++num)
        answer.push_back(num);
    
    return answer;
}

 

 start_num부터 end_num까지의 숫자를 answer에 push하면 되는 간단한 문제이다.

 


 

4. 콜라츠 수열 만들기

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int n) {
    vector<int> answer;
    
    while(n > 1)
    {   
        answer.push_back(n);
        
        // 만약 n이 짝수일 경우, 2로 나눈다.
        // 만약 n이 홀수일 경우, 3 x n + 1로 바꾼다.
        if (n % 2 == 0)
            n /= 2;
        else
            n = 3 * n + 1;
    }
    
    answer.push_back(n);
    
    return answer;
}

 

 짝수일 경우와 홀수일 경우의 처리만 제대로 해주면 되는 문제이다.

 


 

5. 배열 만들기 4

https://school.programmers.co.kr/learn/courses/30/lessons/181918

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> arr) {
    vector<int> stk;
    
    int i = 0;
    
    while(i < arr.size())
    {   
        // 만약 stk가 빈 배열일 경우, arr[i]를 stk에 추가하고 i에 1을 더한다.
        if (stk.size() == 0)
            stk.push_back(arr[i++]);
        else
        {   
            // 만약 stk의 마지막 원소가 arr[i]보다 작을 경우, 
            // arr[i]를 stk의 뒤에 추가하고 i에 1을 더한다.
            if (stk.back() < arr[i])
                stk.push_back(arr[i++]);
            
            // 그렇지 않을 경우, stk의 마지막 원소를 stk에서 제거한다.
            else
                stk.pop_back();
        }
    }
    
    return stk;
}

 

 이 문제 역시 조건을 차분하게 구현하면 되는 문제이다.