テストコード|(c++)プログラマー:Kビット数


に質問


配列のi番からj番までを切り取って並べ替えると、k番目の数字を求めようとします.
例えばarrayが[1,5,2,6,3,7,4],i=2,j=5,k=3の場合
  • 配列の2番目から5番目の場合は[5,2,6,3]である.
  • 1の配列を並べ替えると[2,3,5,6].
  • 2の配列の3番目の数字は5です.
  • 配列配列、[i、j、k]を要素とする2次元配列コマンドをパラメータとして与える場合は、commandsのすべての要素に前述の演算を適用した結果を配列に戻してsolution関数を作成します.

    制限

  • arrayの長さは100を超えない.
  • arrayの各要素は1または100未満です.
  • コマンドの長さは50を超えません.
  • コマンドの各要素の長さは3です.
  • 🎹📢I/O例



    例1
    [1,5,2,6,3,7,4]を2番目から5番目に切り取り、並べ替えます.[2,3,5,6]の3番目の数字は5です.
    例2
    [1,5,2,6,3,7,4]を4番目から4番目に切り取り、並べ替えます.[6]の最初の数字は6である.
    例#3
    [1,5,2,6,3,7,4]最初から7番目にカット[1.2.3.4.5.6.7]の3番目の数字は3です.

    ほどく

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    vector<int> solution(vector<int> array, vector<vector<int>> commands);
    
    int main() {
    	vector<int> output = solution({ 1,5,2,6,3,7,4 }, { {2,5,3},{4,4,1},{1,7,3} });
    	for (int i = 0; i < output.size(); i++) {
    		cout << output[i] << endl;
    	}
    
    	return 0;
    }
    
    // 2차배열인 commands의 요소인 2차 배열의 데이터 구성은 i,j,k
    // array의 i번째 부터 j번째 요소를 잘라내고 오름차순으로 정렬한다.
    // k번째 숫자를 출력한다.(commands의 요소 개수만큼)
    vector<int> solution(vector<int> array, vector<vector<int>> commands) {
    	vector<int> answer;
    	answer.reserve(commands.size()); // capacity 초기 설정
    
    	int i, j, k; // commands 요소의 i, j, k
    
    	for (int cnt = 0; cnt < commands.size(); cnt++)
    	{
    		i = commands[cnt][0] -1; // command의 i (index를 맞추기 위해 -1)
    		j = commands[cnt][1]; // command의 j (j를 포함하기 위해 -1을 해주지 않았다)
    		k = commands[cnt][2] -1; // command의 k
    
    		// 새로 담을 배열 선언
    		vector<int> newArray, sortArray;
    		newArray.reserve(array.size());
    
    		// i인덱스부터 j인덱스까지 추가
    		for (int m = i; m < j; m++) {
    			newArray.push_back(array[m]);
    		}
    
    		// -- vector의 멤버함수 assign를 이용한 복사 --
    		// 이전에 있던 모든 원소를 삭제시키고 새로운 내용으로 덮어씌운다.
    		// newArray.assign(array.begin() + i, array.begin() + j);
    
    		// -- algorithm 라이브러리의 copy함수를 통한 복사 --
    		// 복사할 사이즈가 확보되어야 하고, 이전에 데이터가 있으면 보존된다.
    		// newArray.resize(j - i); // 복사할 사이즈를 확보
    		// copy(array.begin() + i, array.begin() + j, newArray.begin());
    
    		// 정렬
    		sort(newArray.begin(), newArray.end());
    
    		// 결과배열에 k인덱스 추가
    		answer.push_back(newArray[k]);
    	}
    
    	return answer;
    }
    とても簡単な問題です...
    解きほぐしてからずっとソートの問題を考えていたが,ソートが核心的な問題ではないと考えた場合,アルゴリズムライブラリを用いてソートを行った.ソートアルゴリズムが実装されていれば、もっと時間がかかりますよね?
    解が終わった後、ベクトルのデータコピー方法を見つけました.2つのベクトルのメンバー関数の割り当てとアルゴリズムライブラリのcopy関数があります.もっと簡単でいいんじゃない?!

    参考資料とサイト(ありがとうございます)

  • https://programmers.co.kr/learn/courses/30/lessons/42748