Time does not change us. It just unfolds us.

Coding Test

[COS Pro] 1급 4차 C++

소젬 2022. 3. 1. 21:44

빨간날 좋아!

오잉하는 문제들 때문에 82분 너무 오래 풀었다.

빈칸문제 6,7번을 풀다가 포기해서 넘기고 8~10 구현 문제를 풀었다리

 


문제 6)

어떤 자리 수 k가 주어졌을 때 각 자릿수의 k 제곱의 합이 원래 수가 되는 수를 자아도취 수라고 합니다. 예를 들어 153은 세 자리 자아도취 수입니다.

자연수 k가 매개변수로 주어질 때, k 자리 자아도취 수들을 배열에 오름차순으로 담아 return 하도록 solution 함수를 작성하려 합니다. 빈칸을 채워 전체 코드를 완성해주세요.

 

왼쪽이 내 답, 오른쪽이 정답

왜 왼쪽 자리수부터 생각했을꼬 오른쪽부터 했어야했는디; 

 


문제 8)

1 이상 9 이하 숫자가 적힌 카드를 이어 붙여 숫자를 만들었습니다. 이때, 숫자 카드를 조합해 만든 수 중에서 n이 몇 번째로 작은 수인지 구하려 합니다.

예를 들어, 숫자 카드 1, 2, 1, 3로 만들 수 있는 수를 작은 순으로 나열하면 [1123, 1132, 1213, 1231, 1312, ... , 3121, 3211]입니다. n이 1312라면, 숫자 카드를 조합해 만든 수 중 n은 n은 5번째로 작은 수입니다.

숫자 카드를 담은 배열 card, 수 n이 매개변수로 주어질 때 숫자 카드를 조합해 만든 수 중에서 n이 몇 번째로 작은 수인지 return 하도록 solution 함수를 완성해주세요.



매개변수 설명

카드에 적힌 숫자를 담은 배열 card, 수 n이 solution 함수의 매개변수로 주어집니다.

* card는 길이가 9 이하인 배열입니다.
* card의 원소는 1 이상 9 이하인 자연수입니다.
* n은 999,999,999 이하인 자연수입니다.
* n의 자릿수는 배열 card의 길이와 같습니다.
* n의 각 자리의 숫자는 1 이상 9 이하입니다.

return 값 설명

숫자 카드를 조합해 만든 수 중에서 n이 몇 번째로 작은 수인지 return 해주세요.

* 만약, n을 만들 수 없다면 -1을 return 해주세요.

내가 푼 답


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

using namespace std;

int solution(vector<int> card, int n) {
    vector<int> v;
	vector<int> order;

	for(int i=0; i<card.size(); i++){
		order.push_back(i);
	}	
	do{
		 string tmp ="";
		 for(int i=0; i<card.size(); i++) 
			 tmp += card[order[i]] + '0';
		 v.push_back(stoi(tmp));
    }while(next_permutation(order.begin(), order.end()));
	  
	sort(v.begin(),v.end());
	v.erase(unique(v.begin(), v.end()),v.end());

    vector<int>::iterator it = find(v.begin(),v.end(),n);
	int answer = it == v.end() ? -1 : it - v.begin() + 1;
    return answer;
}

 


정답

재귀는 보기도 싫으네


#include <string>
#include <vector>

using namespace std;

vector<int> func_a(vector<int> card) {
    vector<int> card_count(10, 0);
    for (int i = 0; i < card.size(); i++) {
        card_count[card[i]]++;
    }
    return card_count;
}

vector<int> num_list;
void func_b(int level, int max_level, int num, vector<int> current_count, vector<int> max_count) {
    if (level == max_level) {
        num_list.push_back(num);
        return;
    }
    for (int i = 1; i <= 9; i++) {
        if (current_count[i] < max_count[i]) {
            current_count[i] += 1;
            func_b(level + 1, max_level, num * 10 + i, current_count, max_count);
            current_count[i] -= 1;
        }
    }
}

int func_c(vector<int> list, int n) {
    for (int i = 0; i < list.size(); i++) {
        if (n == list[i])
            return i + 1;
    }
    return -1;
}

int solution(vector<int> card, int n) {
    vector<int> card_count = func_a(card);
    func_b(0, card.size(), 0, vector<int>(10, 0), card_count);
    int answer = func_c(num_list, n);
    return answer;
}

string 함수 정리

reverse(answer.begin(),answer.end());
answer.erase(i,answer.size()-i);

vector 함수 정리

v.erase(v.begin()+a);

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

vector<int>::iterator it = find(v.begin(),v.end(),n);
int answer = it == v.end() ? -1 : it - v.begin() + 1;

'Coding Test' 카테고리의 다른 글

Lv2 예상 대진표 C++  (0) 2022.03.23
[COS Pro] 1급 5차 C++ (n진법,재귀)  (0) 2022.03.02
[COS Pro] 1급 3차 C++ (소수)  (0) 2022.02.28
[COS Pro] 1급 2차 C++ (조합)  (0) 2022.02.28
[COS Pro] 1급 1차 C++  (0) 2022.02.27