Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C++で行列の各列の0の個数に基づいて列をソートし、インデックスを出力する方法

N行M列のサイズを持つ行列が与えられたとき、各列に含まれる0の個数を数え、その個数に基づいて列をソートし、ソート後の列のインデックスを出力するのが課題です。

例えば、1列目に0が1つ含まれ、2列目には0がまったく含まれず、3列目に0が2つ含まれている場合、0の少ない順に並べると出力は「2 1 3」になります。

入力例と出力例

Input:
    0 0 0
    1 1 1
    1 0 1
Output: 1 3 2

解説

上記の入力における各列の0の個数は次のとおりです。

  • 1列目: 0が1個(1行目のみ)
  • 2列目: 0が2個(1行目と3行目)
  • 3列目: 0が1個(1行目のみ)

0の個数が少ない順に列を並べると「1 3 2」となり、これが出力されます。0の個数が同じ列が複数ある場合は、元のインデックスが小さい列が先に表示されます。

注意 − 行列のインデックスは1から始まるものとして扱います。

C++による実装

#include <bits/stdc++.h>
#define row 3
#define col 3
using namespace std;
void sorting(int arr[row][col]){
    vector<pair<int, int> >count_zero;
    for (int i = 0; i < col; i++){
        int count = 0;
        for (int j = 0; j < row; j++){
            if (arr[j][i] == 0)
                count++;
        }
        count_zero.push_back(make_pair(count, i));
    }
    sort(count_zero.begin(), count_zero.end());
    for (int i = 0; i < col; i++)
        cout<< count_zero[i].second + 1 << " ";
}
int main(){
    int array[row][col] = {
        { 0, 0, 0 },
        { 1, 1, 1 },
        { 1, 0, 1 }
    };
    cout<<"sorted order of zeroes count is : ";
    sorting(array);
    return 0;
}

アルゴリズムのポイント

  • 0のカウント: 外側のループで各列を走査し、内側のループでその列の要素を確認して0の個数を数えます。
  • pairの活用: vector<pair<int, int>> を使って「0の個数」と「列のインデックス」をペアで管理します。
  • ソート処理: sort() 関数により、0の個数を第一優先、インデックスを第二優先として昇順にソートされます。
  • 出力時の調整: インデックスは内部的に0始まりで保持しているため、出力時に+1して1始まりの番号として表示します。

計算量

全要素の走査にO(N×M)、ソートにO(M log M)が必要となるため、全体の計算量はO(N×M + M log M)です。

出力結果

このプログラムを実行すると、以下の出力が得られます。

sorted order of zeroes count is : 1 3 2
  1. Cプログラムで2次元行列の四隅の要素とその合計を出力する方法

    概要 サイズ2×2以上の2次元配列(行列)が与えられたとき、その四隅に格納されているすべての要素を取り出し、合計を求めて出力するのが本記事のテーマです。 四隅の要素とは? 行数「r」、列数「c」(いずれも0から開始)をもつ行列 mat[r][c] を考えると、四隅の要素は次の4つになります。 左上:mat[0][0] 右上:mat[0][c-1] 左下:mat[r-1][0] 右下:mat[r-1][c-1] したがって、求める合計は次の式で表されます。mat[0][0] + mat[0][c-1] + mat[r-1][0] + mat[r-1][c-1]これらの四隅の要素を取得して加算

  2. C++プログラム:配列内の各要素の最後の出現を相対的な順序で出力する方法

    配列 a[] が与えられたとき、リスト内の各要素について最後に出現したものだけを出力するのが本記事の目的です。ここでは単純に重複要素を削除するだけでなく、各要素が配列内で最後に出現したタイミングに基づき、元の相対的な順序を維持したまま出力する必要があります。例えば、6つの要素を持つ配列 {1, 3, 2, 3, 1, 2} には重複した値が含まれています。この場合、期待される結果は「3 1 2」になります。入力例と出力例Input: a[]={4,2,2,4,1,5,1} Output : 2 4 5 1この例では、「2」はインデックス2で最後に出現し、「4」はインデックス3、「5」はインデッ