Notice
Recent Posts
Recent Comments
Link
거의 알고리즘 일기장
프로그래머스 고득점키트 완전탐색 본문
programmers.co.kr/learn/courses/30/lessons/42840
쉽지만 귀찮은 문제
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
생각보다 어려웠음 ㅋㅋ
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
사실 이 키트에서는 가장 간단한 문제라고 생각한다.
그러므로 풀이방법은 생략하겠음.
코드
#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;
}
반응형
'알고리즘 문제풀이' 카테고리의 다른 글
프로그래머스 _ 괄호 변환 (0) | 2020.09.11 |
---|---|
프로그래머스 _ 문자열 압축 (0) | 2020.09.11 |
프로그래머스 고득점 키트 정렬 (0) | 2020.09.06 |
프로그래머스lv3 _ 이중우선순위큐 (0) | 2020.09.04 |
프로그래머스lv3 _ 디스크 컨트롤러 (0) | 2020.09.04 |
Comments