알고리즘 문제

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

als982001 2024. 2. 14. 22:21

1. 마지막 두 원소

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

 

프로그래머스

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

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> num_list) {
    vector<int> answer;
    
    answer = num_list;
    
    int lastItem = num_list[num_list.size() - 1];
    int befLastItem = num_list[num_list.size() - 2];
    
    if (lastItem > befLastItem)
        answer.push_back(lastItem - befLastItem);
    else
        answer.push_back(lastItem * 2);
    
    return answer;
}

 

 가장 마지막 원소는 num_list[num_list의 길이]가 아닌, num_list[num_list의 길이 - 1]임을 유의해야 한다.

 


 

2. 수 조작하기1

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

 

프로그래머스

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

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

int solution(int n, string control) {
    int answer = 0;
    
    for (int i = 0; i < control.size(); ++i)
    {
        char letter = control[i];
        
        switch(letter) 
        {
            case 'w':
                ++n;
                break;
            case 's':
                --n;
                break;
            case 'd':
                n += 10;
                break;
            case 'a':
                n -= 10;
                break;
        }               
    }
    
    answer = n;
    
    return answer;
}

 

 반복문을 통해 control의 문자 하나하나씩, 주어진 조건에 따라 동작하면 되는 간단한 문제이다.

 


 

3. 수 조작하기2

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

 

프로그래머스

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

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

string solution(vector<int> numLog) {
    string answer = "";
    
    int num = numLog[0];
    
    for (int i = 1; i < numLog.size(); ++i)
    {
        int nxtNum = numLog[i];
        
        if (nxtNum - num == 1)
            answer += "w";
        else if (nxtNum - num == -1)
            answer += "s";
        else if (nxtNum - num == 10)
            answer += "d";
        else if (nxtNum - num == -10)
            answer += "a";
        
        num = nxtNum;
    }
    
    return answer;
}

 

 2번 문제와는 반대로 명령어를 직접 구하는 문제이다. 이 때, 반복문이 한 번 끝날 때마다 num을 갱신해주는 것을 잊지 말아야 한다.

 


 

4. 수열과 구간 쿼리 3

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

 

프로그래머스

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

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)
    {
        // query에서 문제의 i, j를 알아낸다.
        int i = queries[queryIdx][0];
        int j = queries[queryIdx][1];
            
        // arr[i]와 arr[j]의 값을 바꾼다.
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    
    answer = arr;
    
    return answer;
}

 

 반복문에서 각 queryIdx마다 i, j의 값을 구한 후, arr의 각 위치의 숫자를 변경해주면 되는 간단한 문제이다.

 


 

5. 수열과 구간 쿼리 2

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

 

프로그래머스

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

programmers.co.kr

 

#include <string>
#include <vector>
#define INF 987654321

using namespace std;

vector<int> solution(vector<int> arr, vector<vector<int>> queries) {
    vector<int> answer;
    
    for (int i = 0; i < queries.size(); ++i)
    {
        int s = queries[i][0];
        int e = queries[i][1];
        int k = queries[i][2];
        
        int targetNum = INF;
        
        for (int arrIdx = s; arrIdx <= e; ++arrIdx)
        {
            int num = arr[arrIdx];
            
            if (num > k && targetNum > num)
                targetNum = num;
        }
        
        if (targetNum == INF)
            answer.push_back(-1);
        else
            answer.push_back(targetNum);
    }
    
    return answer;
}

 

 특정 쿼리의 답이 존재하지 않으면 -1을 저장해야 한다. 이에 대한 판별은 targetNum이 쿼리 구간의 탐색이 끝났을 경우, 값이 그대로 INF인지 아닌지로 판단한다.