아래 모든 문제들은 프로그래머스에서 제공 되는 문제를 이용하였습니다, 감사합니다.
크레인을 작동하면 해당 라인의 가장 상위에 있는 인형이 무조건 뽑히고, (만약 해당 라인에 인형이 하나도 없으면 아무것도 뽑지 않는다)
뽑은 인형은 바구니에 담는다. 이 때 인형이 연속으로 같은 모양 2개 있으면 터져서 사라진다.
터져서 사라진 인형의 갯수를 구해야한다.
[제한사항]
board 배열은 2차원 배열로 크기는 "5 x 5" 이상 "30 x 30" 이하입니다.
board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
0은 빈 칸을 나타냅니다.
1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
moves 배열의 크기는 1 이상 1,000 이하입니다.
moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.
입출력 예
board moves result
board | moves | result |
---|---|---|
[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] | [1,5,3,5,1,2,1,4] | 4 |
#include
#include
#include
using namespace std;
int solution(vector> board, vector moves) {
vector basket;
int tmp = 0;
int answer = 0;
basket.push_back(0);
for(int i = 0; i < moves.size(); i++)
{
for(int j = 0; j < board.size(); j++)
{
if ((tmp = board[j][moves[i] - 1]) != 0)
{
if(basket.back() == tmp)
{
basket.pop_back();
answer += 2;
}
else
basket.push_back(tmp);
board[j][moves[i] - 1] = 0;
break;
}
}
}
return answer;
}
moves의를 통해 열이 주어지면, 해당 열에서 0 이 아닌 값이 나올떄 까지 for문을 돌리고, 만약 0이 아니라면,
해당 위치의 인형을 뽑는다. 그리고 뽑힌 인형을 바구니에 담아야 하는데, 이떄 담기전에, 마지막에 담은 인형이, 넣을려는 인형과 같은인형인지 확인하기 위해,
if(basket.back() == tmp) 확인하고, 같은 인형이면 카운트 해주고 다른 인형이면, 그냥 쌓아준다.
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.
컴퓨터는 1억()을 넘어가면 시간 제한을 초과할 가능성이 있다.
#include
#include
#include
#include
using namespace std;
string solution(vector participant, vector completion) {
string answer = "";
sort(participant.begin(), participant.end());
sort(completion.begin(), completion.end());
int j;
for(j = 0; j < completion.size(); j++)
{
if(completion[j] != participant[j])
return participant[j];
}
return participant[j];
// for(int i = 0; i < participant.size(); i++)
// {
// for(int j = 0; j < completion.size(); j++)
// {
// if (participant[i] == completion[j])
// {
// completion.erase(completion.begin() + j);
// break;
// }
// if (j == (completion.size() - 1))
// {
// answer = participant[i];
// break;
// }
// }
// if(answer != "")
// break;
// }
return answer;
}
찍는 방식이 세가지가 있다.
1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...
1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.
answers | return |
---|---|
[1,2,3,4,5] | [1] |
[1,3,2,4,2] | [1,2,3] |
#include
#include
#include
#include
using namespace std;
vector solution(vector answers) {
vector> arr{
{1,2,3,4,5}, //5
{2,1,2,3,2,4,2,5}, //8
{3,3,1,1,2,2,4,4,5,5} //10
};
vector arr_size = {5,8,10};
vector save = {0,0,0};
for(int i = 0; i < answers.size(); i++)
{
for(int j = 0; j < 3; j ++)
{
if(answers[i] == arr[j][i % (arr_size[j])])
save[j] += 1;
}
}
int max = *max_element(save.begin(), save.end());
vector answer;
for(int j = 0; j < 3; j ++)
{
if (max == save[j])
answer.push_back(j + 1);
}
return answer;
}
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
전체 학생의 수는 2명 이상 30명 이하입니다.
체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
#include
#include
using namespace std;
int solution(int n, vector lost, vector reserve) {
int answer = 0;
vector arr;
int j = 0;
arr.push_back(1);
for(int i = 0; i < n; i++)
if(lost[j] - 1 == i){
arr.push_back(0);
j += 1;
}
else
arr.push_back(1);
arr.push_back(1);
for(int i = 0; i < reserve.size(); i++)
{
if(arr[reserve[i]] == 0)
arr[reserve[i]] = 1;
else if(arr[reserve[i] - 1] == 0)
{
arr[reserve[i] - 1] = 1;
}
else if(arr[reserve[i] + 1] == 0)
{
arr[reserve[i] + 1] = 1;
}
}
for (int i = 0; i < arr.size(); i++)
{
if (arr[i] == 1)
answer += 1;
}
return answer - 2;
}
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
n은 1 이상 100,000,000 이하인 자연수입니다.
#include
#include
#include
using namespace std;
int solution(int n) {
vector s;
int answer = 0;
for (; n != 0; n = n / 3)
{
s.push_back(n % 3);
}
int tmp = 1;
for (int i = 0; i < s.size(); i++)
{
answer += s[s.size() - 1 - i] * tmp;
tmp = tmp * 3;
}
return answer;
}
arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.
붙어있는 같은 숫자를 제거한 배열 리턴
#include
#include
using namespace std;
vector solution(vector arr)
{
vector answer;
// if(arr.size() == 0)
// return answer;
answer.push_back(arr[0]);
for(int i = 1; i < arr.size(); i++)
if(answer.back() != arr[i])
answer.push_back(arr[i]);
return answer;
}
두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
a와 b의 대소관계는 정해져있지 않습니다.
#include
#include
using namespace std;
long long solution(int a, int b) {
long long answer = 0;
for (int i = a < b ? a : b; i <= (a > b ? a : b); i++)
{
answer += i;
}
return answer;
}
대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.
문자열 s의 길이 : 50 이하의 자연수
문자열 s는 알파벳으로만 이루어져 있습니다.
#include
#include
#include
using namespace std;
bool solution(string s)
{
int tmp_p = 0;
int tmp_y = 0;
for(int i = 0; i < s.size(); i++)
{
if (s[i] == 'p' || s[i] == 'P')
tmp_p += 1;
else if(s[i] == 'y' || s[i] == 'Y')
tmp_y += 1;
}
if (tmp_p == tmp_y)
return true;
return false;
}
문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.
s는 길이 1 이상, 길이 8 이하인 문자열입니다.
#include
#include
#include
using namespace std;
bool solution(string s) {
int size = s.size();
for(int i = 0; i < size || (size != 4 && size != 6) ; i++)
if(0 == isdigit(s[i]))
return false;
return true;
}
1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.
소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)
n은 2이상 1000000이하의 자연수입니다.
#include
#include
using namespace std;
int solution(int n) {
int answer = 0;
bool* PrimeArray = new bool[n + 1];
for (int i = 2; i <= n; i++)
PrimeArray[i] = true;
for (int i = 2; i * i <= n; i++)
{
if (PrimeArray[i])
for (int j = i * i; j <= n; j += i)
{
PrimeArray[j] = false;
}
}
for (int i = 2; i <= n; i++)
if(PrimeArray[i] == 1)
answer += 1;
// int flag =0;
// for (int i = 2; i <= n; i++)
// {
// flag = 0;
// for (int j = 2; (j * j) <= i; j++)
// if (i % j == 0){
// flag = 1;
// break;
// }
// if (flag == 0)
// answer += 1;
// }
return answer;
}