728x90

(1) 문제

고속도로를 이동하는 모든 차량이 고속도로를 이용하면서 단속용 카메라를 한 번은 만나도록 카메라를 설치하려고 합니다.

고속도로를 이동하는 차량의 경로 routes가 매개변수로 주어질 때, 모든 차량이 한 번은 단속용 카메라를 만나도록 하려면 최소 몇 대의 카메라를 설치해야 하는지를 return 하도록 solution 함수를 완성하세요.


(2) 제한사항

  • 차량의 대수는 1대 이상 10,000대 이하입니다.
  • routes에는 차량의 이동 경로가 포함되어 있으며 routes[i][0]에는 i번째 차량이 고속도로에 진입한 지점, routes[i][1]에는 i번째 차량이 고속도로에서 나간 지점이 적혀 있습니다.
  • 차량의 진입/진출 지점에 카메라가 설치되어 있어도 카메라를 만난것으로 간주합니다.
  • 차량의 진입 지점, 진출 지점은 -30,000 이상 30,000 이하입니다.

(3) 코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<vector<int>> routes) {
    int answer = 1;
    int n_end = 0;

    sort(routes.begin(), routes.end());

    for (int i = 0; i < routes.size(); i++)
    {
        if (n_end > routes.at(i).at(1))
        {
            n_end = routes.at(i).at(1);
        }

        if (routes.at(i).at(0) > n_end)
        {
            answer++;
            n_end = routes.at(i).at(1);
        }
        
    }

    return answer;
}

(4) 실행결과


 

반응형
728x90

(1) 문제

무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다.

예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 50kg]이고 구명보트의 무게 제한이 100kg이라면 2번째 사람과 4번째 사람은 같이 탈 수 있지만 1번째 사람과 3번째 사람의 무게의 합은 150kg이므로 구명보트의 무게 제한을 초과하여 같이 탈 수 없습니다.

구명보트를 최대한 적게 사용하여 모든 사람을 구출하려고 합니다.

사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 return 하도록 solution 함수를 작성해주세요.


(2) 제한사항

  • 무인도에 갇힌 사람은 1명 이상 50,000명 이하입니다.
  • 각 사람의 몸무게는 40kg 이상 240kg 이하입니다.
  • 구명보트의 무게 제한은 40kg 이상 240kg 이하입니다.
  • 구명보트의 무게 제한은 항상 사람들의 몸무게 중 최댓값보다 크게 주어지므로 사람들을 구출할 수 없는 경우는 없습니다.

(3) 코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<int> people, int limit) {
    int answer = 0;
    sort(people.begin(), people.end());
    
    int begin = 0;
    int end = people.size() - 1;

    while (begin <= end)
    {
        if (people.at(begin) + people.at(end) > limit)
        {
            answer++;
            end--;            
        }
        else
        {
            answer++;
            end--;
            begin++;            
        }
    }    

    return answer;
}

(4) 실행결과


 

반응형
728x90

(1) 문제

어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.

예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.

문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.


(2) 제한사항

  • number는 1자리 이상, 1,000,000자리 이하인 숫자입니다.
  • k는 1 이상 number의 자릿수 미만인 자연수입니다.

(3) 코드

#include <iostream>
#include <string>
 
using namespace std;
 
string solution(string number, int k) {
    string answer = "";
    for (int j = 0, index = -1; j < number.length() - k; j++) {
        char max = 0;
        for (int i = index + 1; i <= k + j; i++) {
            if (max < number[i]) {
                index = i;
                max = number[i];
            }
        }
        answer += max;
    }
    return answer;
}

(4) 실행결과


 

반응형
728x90

(1) 문제

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.

전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.


(2) 제한사항

  • 전체 학생의 수는 2명 이상 30명 이하입니다.
  • 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
  • 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

(3) 코드

#include <string>
#include <vector>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    int count = 0;

    vector<int> _lost = lost;
    vector<int> _reserve = reserve;

    int same_case = 0;

    bool *check = new bool[_reserve.size()];
    
    for (int i = 0; i < _reserve.size(); i++)
    {
        check[i] = false;
    }
    
    try
    {
        for (int i = 0; i < _lost.size() - same_case; i++)
        {
            for (int j = 0; j < _reserve.size() - same_case; j++)
            {
                if (_reserve.at(j) == _lost.at(i))
                {
                    _reserve.erase(_reserve.begin() + j);
                    _lost.erase(_lost.begin() + i);
                    same_case++;
                }
            }
        }
    }
    catch (const std::exception&)
    {

    }
             

    for (int i = 0; i < _lost.size(); i++)
    {
        for (int j = 0; j < _reserve.size(); j++)
        {
            if (_reserve.at(j) - _lost.at(i) == 1 || _reserve.at(j) - _lost.at(i) == -1 && check[j] == false)
            {
                check[j] = true;
            }
        }
    }
    
    for (int i = 0; i < _reserve.size(); i++)
    {
        if (check[i] == true)
        {
            count++;
        }
    }

    if (_lost.size() <= count)
    {
        answer = n;
    }
    else
    {
        answer = n - (_lost.size() - count);
    }
    
    return answer;
}

(4) 실행결과


반응형
728x90

(1) 문제

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.

각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.


(2) 제한사항

  • numbers는 길이 1 이상 7 이하인 문자열입니다.
  • numbers는 0~9까지 숫자만으로 이루어져 있습니다.
  • 013은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.

(3) 코드

#include <string>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

bool isPrime(int n);

int solution(string numbers) {
    int answer = 0;
    vector<int> number;
    string str_temp = "";

    sort(numbers.begin(), numbers.end());

    do
    {
        for (int i = 0; i < numbers.size(); i++)
        {
            for (int j = 0; j < numbers.size() - i; j++)
            {
                str_temp += numbers.at(j);
            }
            number.push_back(stoi(str_temp));
            str_temp = "";
        }
    } while (next_permutation(numbers.begin(), numbers.end()));

    sort(number.begin(), number.end());
    number.erase(unique(number.begin(), number.end()), number.end());

    for (int i = 0; i < number.size(); i++)
    {
        if (!isPrime(number.at(i)))
        {
            number.erase(number.begin() + i);
            i--;
        }
    }

    answer = number.size();

    return answer;
}

bool isPrime(int n) {
    if (n <= 1) {
        return false;
    }

    for (int i = 2; i <= sqrt(n); i++) {
        if ((n % i) == 0) {
            return false;
        }
    }

    return true;
}

(4) 실행결과


 

반응형
728x90

(1) 문제

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

예제그림

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.


(2) 제한사항

  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

(3) 코드

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int brown, int yellow) {
    vector<int> answer;
    vector<int> factor;
    int square_size = brown + yellow;
    int square_width = 0;
    int square_height = 0;

    for (int i = 3; i < square_size; i++)
    {
        if (square_size % i == 0)
        {
            factor.push_back(i);
        }        
    }

    for (int i = 0; i < factor.size(); i++)
    {
        square_height = factor.at(i);
        square_width = square_size / square_height;

        if (square_width * 2 + square_height * 2 - 4 == brown)
        {
            answer.push_back(square_width);
            answer.push_back(square_height);

            return answer;
        }

    }
}

(4) 실행결과


 

반응형
728x90

(1) 문제

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

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 함수를 작성해주세요.


(2) 제한사항

  • 시험은 최대 10,000 문제로 구성되어있습니다.
  • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

(3) 코드

#include <string>
#include <vector>
#include <map>

using namespace std;

int patten_2(int i);
int patten_3(int i);

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> answer_count(3);

    int count_max = 0;
    
    int answer_1 = 0;
    int answer_2 = 0;
    int answer_3 = 0;

    for (int i = 0; i < answers.size(); i++)
    {
        answer_1 = ((i + 1) % 5) == 0 ? 5 : (i + 1) % 5;
        answer_2 = ((i + 1) % 2) == 0 ? patten_2(i + 1) : 2;
        answer_3 = patten_3(i + 1);

        if (answer_1 == answers.at(i)) answer_count.at(0)++;
        if (answer_2 == answers.at(i)) answer_count.at(1)++;
        if (answer_3 == answers.at(i)) answer_count.at(2)++;
    }

    answer_count.at(0) >= answer_count.at(1) ?
        answer_count.at(0) >= answer_count.at(2) ?
        count_max = answer_count.at(0) : count_max = answer_count.at(2)

        : answer_count.at(1) >= answer_count.at(2) ?
        count_max = answer_count.at(1) : count_max = answer_count.at(2);

    for (int i = 0; i < answer_count.size(); i++)
    {
        if(answer_count.at(i) == count_max)
        {
            answer.push_back(i + 1);
        }
    }
    return answer;
}

int patten_2(int i)
{
    switch (i % 8)
    {
    case 0:
        return 5;
    case 2:
        return 1;
    case 4:
        return 3;
    case 6:
        return 4;
    }
}

int patten_3(int i)
{
    switch (i % 10)
    {
    case 1:
    case 2:
        return 3;
    case 3:
    case 4:
        return 1;
    case 5:
    case 6:
        return 2;
    case 7:
    case 8:
        return 4;
    case 9:
    case 0:
        return 5;
    }
}

(4) 실행결과


 

반응형
728x90

(1) 문제

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다.

어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.

어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.


(2) 제한사항

  • 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
  • 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.

(3) 코드

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> citations) {
    int answer = 0;
    int value = 0;
    int count = 0;
    bool IsPass = true;

    while (IsPass)
    {
        for (int i = 0; i < citations.size(); i++)
        {
            if (value <= citations.at(i))
            {
                count++;
            }
        }

        if (value > count)
        {
            IsPass = false;
            break;
        }

        count = 0;
        value++;
    }

    return answer = value - 1;
}

(4) 실행결과


 

반응형
728x90

(1) 문제

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.


(2) 제한사항

  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

(3) 코드

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;
    int n_count = 0;
    
    while (!progresses.empty())
    {
        for (int i = 0; i < progresses.size(); i++)
        {
            progresses.at(i) += speeds.at(i);
            
			if (progresses.at(0) >= 100)
			{
				n_count++;
				progresses.erase(progresses.begin());
                speeds.erase(speeds.begin());
                i--;
			}            
        }
        if (n_count > 0)
        {
            answer.push_back(n_count);
            n_count = 0;
        }
    }
    

    return answer;
}

(4) 실행결과


반응형
728x90

(1) 문제

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.


(2) 제한사항

  • prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
  • prices의 길이는 2 이상 100,000 이하입니다.

(3) 코드

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> prices) {
    vector<int> answer;
    int count = 0;
    
    for (int i = 0; i < prices.size(); i++)
    {
        for (int j = i + 1; j < prices.size(); j++)
        {
            count++;
            if (prices.at(i) > prices.at(j))
            {
                break;
            }
        }

        answer.push_back(count);
        count = 0;
    }
    

    return answer;
}

(4) 실행결과


반응형

+ Recent posts