はじめに
エンジニアのみなさんアルゴリズム問題を最後に解いたのはいつですか?
アルゴリズムの問題は、自分自身でAtCoderなどで学習しない限りは、未経験からエンジニア転職を志す際や新入社員研修くらいでしか触れる機会が無い気がします。
そこで今回は、エンジニア歴1~3年目程度のジュニアエンジニア対象に1問、アルゴリズム問題を出題します。業務前・業務の息抜きに取り組んでみてください。
※私は最近学習した言語がJavaの関係で問題文や回答・解説にはJavaを用いますが、考え方はどの言語でも共通だと思うため、ご自身の得意な言語に置き換えてください。
問題
Javaを使って、次のような正三角形の形をアスタリスク(*
)で出力してください。
*
***
*****
*******
*********
制約
①行数は「5行」で固定とする。
②各行にアスタリスク(*
)を使って中央揃えの正三角形を出力すること。
③ループや条件分岐を活用すること。
ヒント
①各行の出力は「スペース + アスタリスク」の組み合わせです。
②i
行目に出力されるアスタリスクの数は 2*i + 1
本です。
③各行の先頭に必要なスペースの数は n - i - 1
個です(n
は行数)。
模範回答例(閲覧注意)
public class EquilateralTriangle {
public static void main(String[] args) {
int n = 5; // 行数
// for文の構成は、①初期化式 ②条件式 ③加算式
for (int i = 0; i < n; i++) {
// 左側のスペースを出力(中央揃えにする)
for (int j = 0; j < n - i - 1; j++) {
System.out.print(" ");
}
// アスタリスクを出力
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println(); // 改行
}
}
}
解説
全体構造
この三角形は各行に奇数個のアスタリスクが並び、中央揃えで表示されます。
行番号(i) | スペースの数 | アスタリスクの数 |
---|---|---|
0 | 4 | 1 |
1 | 3 | 3 |
2 | 2 | 5 |
3 | 1 | 7 |
4 | 0 | 9 |
ループの使い方
①外側のループ:各行を処理する。
②1つ目の内側ループ:先頭のスペースを出力(n - i - 1
個)。
③2つ目の内側ループ:アスタリスクを2*i + 1
個出力。
出題の意図
この問題では、文字の配置と整列を工夫し、左右対称な正三角形を表現でき、パターン出力の基礎と中央揃えのロジックを学ぶのに非常に有効です。
この形式をベースに、次のような応用問題に進むこともできるため、自分自身で構成を考えてみることでアルゴリズムの理解度が向上するかもしれません。
- 入力によって行数を動的に変える
- 空洞の三角形(縁だけが
*
の形) - 逆三角形、ひし形、クリスマスツリー型 など