C言語で指定された括弧ペアを使ってバランスの取れた括弧式を出力するプログラム
この記事では、あらかじめ値が定められた4つの変数 a、b、c、d に応じて対応する括弧を出力し、それらをすべて使い切ったバランスの取れた括弧式を生成するCプログラムについて解説します。
問題の概要
各変数は、次の括弧ペアに対応しています。
a … (( b … () c … )( d … ))
求められているのは、与えられたすべての括弧を使い切ってバランスの取れた括弧式を出力することです。もしバランスの取れた式を構成できない場合は -1 を出力します。答えが複数存在する場合は、そのうちのどれを出力しても構いません。
入出力例
入力: a = 3, b = 2, c = 4, d = 3 出力: (((((()()()()())))))()()
解き方のアプローチ
最初に、与えられた個数の括弧からバランスの取れた式が作れるかどうかを判定します。作成可能な場合は、以下の順序で出力していきます。
- タイプ1の括弧「((」を a 個出力する
- タイプ3の括弧「)(」を c 個出力する
- タイプ4の括弧「))」を d 個出力する
- タイプ2の括弧「()」を b 個出力する
この順序が機能する理由は次のとおりです。「((」はネストの深さを2だけ増やし、「))」は2だけ減らします。途中で深さが負にならず、最後に0へ戻るためには a と d が等しい必要があります。「)(」は深さを変えないため、「((」と「))」の間に自由に配置できます。また「()」はそれ自体で完結したペアなので、どこに出力してもバランスを壊しません。a が 0 の場合は深さを上げる括弧が存在しないため、c と d も 0 であることが条件となります(b だけの構成)。
アルゴリズム
START
ステップ1 -> 関数 void print(int a, int b, int c, int d) を宣言し、int i を用意する
IF ((a == d && a) || (a == 0 && c == 0 && d == 0))
i = 1 から i <= a までループして「((」を出力
i = 1 から i <= c までループして「)(」を出力
i = 1 から i <= d までループして「))」を出力
i = 1 から i <= b までループして「()」を出力
ELSE
「構成できない」こと(-1)を出力
ステップ2 -> main()
int a = 3, b = 2, c = 4, d = 3 を宣言
print(a, b, c, d) を呼び出す
STOP
C言語での実装例
#include<stdio.h>
void print(int a, int b, int c, int d){
int i;
if ((a == d && a) || (a == 0 && c == 0 && d == 0)){
for (i = 1; i <= a; i++)
printf("((");
for (i = 1; i <= c; i++)
printf(")(");
for (i = 1; i <= d; i++)
printf("))");
for (i = 1; i <= b; i++)
printf("()");
}
else
printf("-1");
}
int main(){
int a = 3, b = 2, c = 4, d = 3;
print(a, b, c, d);
return 0;
}
実行結果
上記のプログラムを実行すると、次の出力が得られます。
(((((()()()()())))))()()
-
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の個数は次のとおり
-
指定された文字から作成できる単語をすべて出力するPythonプログラム
このチュートリアルでは、与えられた文字のリストを使って作成できるすべての単語を見つけて出力する方法を解説します。まずはテストケースを通して、やりたいことを具体的にイメージしましょう。入力: words = [hi, hello, bye, good] characters = [h, i, b, y, e] 出力: hi byeこの例では、「hi」と「bye」は characters リストに含まれる文字だけで構成されているため出力されます。一方、「hello」には必要な「l」が2つあるのにリストには1つもなく、「good」に必要な「g」「o」「d」もリストに存在しないため、これらは出力され