거의 알고리즘 일기장

프로그래머스 고득점키트 완전탐색 본문

알고리즘 문제풀이

프로그래머스 고득점키트 완전탐색

건우권 2020. 9. 6. 16:05

programmers.co.kr/learn/courses/30/lessons/42840

 

코딩테스트 연습 - 모의고사

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

programmers.co.kr

쉽지만 귀찮은 문제 

1. 수험생 1, 2, 3의 루틴을 주어진 answers의 사이즈에 맞춰서 반복시켜 답안을 만들어준다.

2. 답안을 확인한다.

3. 제일 잘 맞춘 아이를 answer에 넣는다.

4. 정렬한다.


코드

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

using namespace std;

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

    //1. answers를 string으로 변경 
    string strAnswer = "";
    for (int ele : answers)
    {
        char oneAns = ele + '0';
        strAnswer += oneAns;
    }

    //2. 수포자들의 루틴을 answers의 길이만큼 늘린다.
    int answersSize = answers.size();
    string routin1 = "12345";
    string routin2 = "21232425";
    string routin3 = "3311224455";

    string answer1, answer2, answer3;
    int numOfRepeat1 = answersSize/ routin1.size() + 1;
    int numOfRepeat2 = answersSize / routin2.size() + 1;
    int numOfRepeat3 = answersSize / routin3.size() + 1;

    for (int i = 0; i < numOfRepeat1; i++)
        answer1 += routin1;

    for (int i = 0; i < numOfRepeat2; i++)
        answer2 += routin2;

    for (int i = 0; i < numOfRepeat3; i++)
        answer3 += routin3;

    //3. 답안을 확인
    int numOfCollect1 = 0;
    int numOfCollect2 = 0;
    int numOfCollect3 = 0;
    for (int i = 0; i < answersSize; i++)
    {
        if (answer1[i] == strAnswer[i])
            numOfCollect1++;
        if (answer2[i] == strAnswer[i])
            numOfCollect2++;
        if (answer3[i] == strAnswer[i])
            numOfCollect3++;
    }

    int maxCollect = max(numOfCollect1, numOfCollect2);
    maxCollect = max(maxCollect, numOfCollect3);

    //4. 잘맞은 아이를 answer에 넣는다
    if (maxCollect == numOfCollect1)
        answer.push_back(1);
    if (maxCollect == numOfCollect2)
        answer.push_back(2);
    if (maxCollect == numOfCollect3)
        answer.push_back(3);

    return answer;
}

programmers.co.kr/learn/courses/30/lessons/42839

 

코딩테스트 연습 - 소수 찾기

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

programmers.co.kr

생각보다 어려웠음 ㅋㅋ

1. numbers로 만들 수 있는 max값을 찾는다.

2. 2 ~ max 값까지의 소수를 구해 checklist에 넣는다.

3. checklist를 돌리면서 그 수가 numbers로 만들수 있는것인지 확인한다.


코드

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

using namespace std;

bool compare(const char& a, const char& b)
{
    return a > b;
}

bool isPrime(int num)
{
    if (num == 1)
        return false;
    if (num == 2)
        return true;
    if (num % 2 == 0)
        return false;

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

    return true;
}

int solution(string numbers) {
    int answer = 0;

    //1. numbers로 만들수 있는 maxValue를 구한다.
    vector<char> temp;
    for (char ele : numbers)
        temp.push_back(ele);
    
    sort(begin(temp), end(temp), compare);
    
    string strMaxValue = "";
    for (char ele : temp)
        strMaxValue += ele;

    int maxValue = stoi(strMaxValue.c_str());

    //2. 2 ~ maxValue까지의 소수들을 모두 구해서 checklist에 넣어둔다.
    vector<string> checkList;
    for (int i = 2; i <= maxValue; i++)
    {
        if (isPrime(i) == true)
            checkList.push_back(to_string(i));
    }

    //3. checklist를 돌리면서 그 수가 numbers로 만들수 있는것인지 확인한다.
    for (string checkNum : checkList)
    {
        string numbersTemp = numbers;
        bool isPossible = true;

        for (int i = 0; i < checkNum.size(); i++)
        {
            //탈출조건
            if (isPossible == false)
                break;

            char checkChar = checkNum[i];

            //checkChar가 존재하는지 확인
            bool isExist = false;
            for (int j = 0; j < numbersTemp.size(); j++)
            {
                char compareChar = numbersTemp[j];

                //존재한다면
                if (checkChar == compareChar)
                {
                    numbersTemp.erase(begin(numbersTemp) + j);
                    isExist = true;
                    break;
                }
            }

            if (isExist == false)
                isPossible = false;
        }

        //이 소수가 만들수 있을 경우
        if (isPossible == true)
            answer++;
    }

    return answer;
}

programmers.co.kr/learn/courses/30/lessons/42842

 

코딩테스트 연습 - 카펫

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

programmers.co.kr

사실 이 키트에서는 가장 간단한 문제라고 생각한다.

그러므로 풀이방법은 생략하겠음.


코드

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

using namespace std;

vector<int> solution(int brown, int yellow) {
    vector<int> answer;

    for (int i = 1; i <= yellow; i++)
    {
        //사각형이 되어야 하므로
        if (yellow % i != 0)
            continue;

        int y_width = i;
        int y_height = yellow / i;

        //감쌀수 있는지 확인 (w+2)*2 + (h*2)가 brown과 같은지 확인
        int needBrown = (y_width + 2) * 2 + (y_height * 2);

        if (needBrown == brown)
        {
            answer = { y_width + 2, y_height + 2 };
            break;
        }
    }
    sort(begin(answer), end(answer), greater<int>());

    return answer;
}

 

반응형
Comments