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) Next_permutation 함수란?

범위의 요소를 [first,last]다음 사전 식으로더 큰 순열로 다시 정렬합니다. 

 ex) 1,2,3 -> 1,3,2 -> 2,1,3 -> 2,3,1 -> 3,1,2 -> 3,2,1

단, 1,3,2 에서 시작 시 1,2,3의 경우는 돌아가지 않는다.


(2) Next_permutation 함수 구조

  • 필요 헤더  
#include <algorithm>

 

  • 템플릿
//default
template <class BidirectionalIterator>
  bool next_permutation (BidirectionalIterator first,
                         BidirectionalIterator last);

//custom(비교문을 넣을 수 있음)                         
template <class BidirectionalIterator, class Compare>
  bool next_permutation (BidirectionalIterator first,
                         BidirectionalIterator last, Compare comp);
                         
 <------------------------예제------------------------>
#include <iostream>     // std::cout
#include <algorithm>    // std::next_permutation, std::sort

int main () {
  int myints[] = {1,2,3};

  std::sort (myints,myints+3);

  std::cout << "The 3! possible permutations with 3 elements:\n";
  do {
    std::cout << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '\n';
  } while ( std::next_permutation(myints,myints+3) );

  std::cout << "After loop: " << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '\n';

  return 0;
}

(3) Next_permutation 사용법

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	vector<int> v;

	v.push_back(2);
	v.push_back(1);
	v.push_back(3);

//모든 경우의 수를 확인하기 위해 최초 벡터를 오름차순으로 정렬
	sort(v.begin(), v.end());
	
	do {
		for (int i = 0; i < v.size(); i++)
		{
			cout << v.at(i);
		}
		cout << endl;
	} while (next_permutation(v.begin(), v.end()));

	return 0;
}

실행결과

 

아래 링크를 통해 Next_permutation 함수를 사용한 완전탐색예제를 확인하실수 있습니다.

 

2020/11/27 - [Programmers/C++] - [프로그래머스] 코딩테스트 연습 > 완전탐색 > 소수 찾기(C++)


반응형

'Study > C++' 카테고리의 다른 글

[TCP] TCP - Server  (2) 2020.11.06
[STL] Vector Container 기본 사용법  (0) 2020.10.21
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) 실행결과


반응형
728x90

(1) 문제

ANIMAL_INS 테이블에 등록된 모든 레코드에 대해, 각 동물의 아이디와 이름, 들어온 날짜1를 조회하는 SQL문을 작성해주세요. 이때 결과는 아이디 순으로 조회해야 합니다.


(2) 코드

-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, LEFT(DATETIME, INSTR(DATETIME, ' ') - 1) AS 날짜
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

 

반응형

+ Recent posts