Aエレベータ
問題
下から順に B9, B8, ..., B1, 1F, 2F, ..., 9F と呼ばれる 18 のフロアを持つ建物があります。 この建物のエレベーターは、隣接する 2 つのフロア間の移動に常に 1 秒を要します。例えば、B9 から 9F への移動には 17 秒を要し、反対方向も同様です。 2 つのフロア S, T が与えられます。エレベーターが S から T へ移動するには最短で何秒を要するでしょうか。
解法
フロア名から階数、地下階、地上階かを判断するため文字列の切り取りをするインデクサー[]を利用。 地下と地上の移動時間の算出には、階数の引き算では0階がないためうまくいかない。そこで地下の階数にあえて+1を加える。
var input = Console.ReadLine().Split(); var s = input[0]; var t = input[1]; int si=0; if (s[0] == 'B') { si = -int.Parse(s[1].ToString())+1; } else if(s[1] == 'F') { si = int.Parse(s[0].ToString()); } int ti=0; if (t[0] == 'B') { ti = -int.Parse(t[1].ToString())+1; } else if (t[1] == 'F') { ti = int.Parse(t[0].ToString()); } var result = Math.Abs(si - ti); Console.WriteLine(result);
B多数決
文字列の切り取りをするインデクサー[]を利用
問題
ある国で選挙が行われました。候補者は a, b, c の 3 名です。
投票されたすべての票を表す文字列 S が与えられます。 S は英小文字 a, b, c からなり、 S の i 文字目は i 番目の投票者が投票した候補者を表します。最多得票を得た候補者は誰か求めてください。
なお、最多得票を得た人物はちょうど 1 名であることが保証されています。
解法
var s = Console.ReadLine(); int counta = 0; int countb = 0; int countc = 0; for (int i = 0; i < s.Length; i++) { if (s[i].ToString() == "a") { counta++; } else if (s[i].ToString() == "b") { countb++; } else { countc++; } } if (counta > countb && counta > countc) { Console.WriteLine('a'); } else if (countb > counta && countb > countc) { Console.WriteLine('b'); } else { Console.WriteLine('c'); }
C
ジャグ配列の操作を行う。
ジャグ配列はまず行の要素数を決めその後に列の要素数を決める。
問題
https://atcoder.jp/contests/past202004-open/tasks/past202004_c
static void Main(string[] args) { var N = int.Parse(Console.ReadLine()); string[][] S = new string[N][]; for (int i = 0; i < N; i++) { S[i] = new string[2 * N - 1]; var input = Console.ReadLine(); for (int j = 0; j < 2 * N - 1; j++) { S[i][j] = input[j].ToString(); } } for (int i = N-2; i >= 0; i--) { for (int j = 1; j < 2 * N - 2; j++) { if (S[i][j] == "#") { if (S[i + 1][j - 1] == "X" || S[i + 1][j] == "X" || S[i + 1][j + 1] == "X")// { S[i][j] = "X"; } } } } for (int i = 0; i < N; i++) { for (int j = 0; j < 2 * N - 1; j++) { Console.Write(S[i][j]); } Console.WriteLine(""); } }