프로그래머스 - 코딩 기초 트레이닝 캘린더 Day 6
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인지 아닌지로 판단한다.