C# paiza D問題備忘録
はじめに
paizaのスキルチェックD問題全173問(2021.3末時点)を解いた際に、
必要となり調べたことや覚えたことの備忘録です。
基本の形
using System;
class Program
{
static void Main()
{
// 自分の得意な言語で
// Let's チャレンジ!!
var line = Console.ReadLine();
Console.WriteLine("XXXXXX");
}
}
型の変更:int.Parse()/float.Parse();
var hoge = Console.ReadLine();
で読み込んだものは基本string型で初期登録される。
これをint型に直したい場合は
var hoge = int.Parse(Console.ReadLine());
と宣言するか、使いたい場所で
int.Parse(hoge);
と使う。
宣言されたあとはintとして登録されているので
int fuga = hoge + 10;
として使うことが可能。
またfloatも使うことが可能。
小数点以下を表示したい場合は
hoge.ToString("F1") // Fは少数点以下何位まで表示するかの指定
と書く。
最大値、最小値
配列の中の最小値、最大値を求めたい場合は
using System.Linq;
を使って
int[] numbers = { 3, 1, 5, 6, 9, 2 };
Console.WriteLine(numbers.Max());
のように求める。
文字列の分割/置き換え
分割
例:string hoge = "Jonny 3150 Dayo";
var fuga = hoge.Split(' '); // Jonnyと3150とDayoに分割される
hogeが半角スペースで区切られているように、
区切り文字を指定してそこで分割したい場合はこれを使う。
分けたものは fuga[0],fuga[1]のように配列として保存されている。
置き換え
例:var hoge = "i wanna be the guy";
var fuga = hoge.Replace("guy", "GAL");
と置き換えることができる。
複数対象がある場合は後ろに.Replaceを繋げていくことで対応可。
var string intについて
なんとなくだけど、
→右側が指定されている場合はvarを使用
→右側がなんかのLengthだったりValueだったり取得してくる系は戻ってきて欲しい型で宣言
みたいな印象がある。はっきりとはわからん。
文字列の改行
→\r\n を使う。Unityだと\nだけだった気がするので厄介だね。
小数点以下の切り捨て/下げ/上げ
Math.Truncate(hoge); // 切り捨て
Math.Floor(hoge); // 切り下げ
Math.Ceiling(hoge); // 切り上げ
また、小数をint型に変換すると、無条件に小数点以下は切り捨てられる。
桁を指定した四捨五入
例:float hoge = 3.1415;
var fuga = Math.Round(hoge, 1, MidpointRounding.AwayFromZero);
// Math.Round(四捨五入したい数値 , 小数点第何位まで表示したいか , おまじない);
// この場合fugaは3.5となる
通常何も引数を付けないままMath.Roundを実行すると、
現在の数値から1番近い偶数に向かって処理されてしまう(例:-1.5 → -2)
MidpointRounding.AwayFromZeroを使うことで0に向かって処理することができる。
配列の中に指定の文字があるかどうか
string[] data = {"hoge","Jonny","Cool"};
int result = Array.IndexOf(data, "hoge");
もしdataの中に“hoge”がなかった場合は-1がresultに入る。
あった場合はその要素の位置が取得できる。
あるかないかだけを確認したい場合は、0以上か負の値かで確認ができる。
大文字小文字変換
hoge.ToUpper() // 文字列を全て大文字に変換
hoge.ToLower() // 文字列を全て小文字に変換
文字の切り出し
var hoge = "じょにーは天才"
var fuga = hoge.Substring(0, 3);
としたときに、fugaの中身は「じょに」となる。
hoge.Substring(開始位置,何文字切り出すか);
開始位置から数えて何文字分かを後ろに書くのですごく間違えやすい。注意!
N列分の読み込み
string[] lines = new string[N];
for (int i = 0; i < N; i++)
{ lines[i] = Console.ReadLine(); }
として配列に一度入れてから使う
その後、横並びに要素がいくつもある場合は
string[] data = lines[i].Split(’ ');
で for文の中でSplitしてそれぞれ要素をあらかじめ作った配列に入れる。
数字の末尾を0にする
int型だと小数点以下が切り捨てられることを利用して
元の数値÷(下一桁なら)10をして、また10をかけると末尾が0になる。
文字列の抽出
「数字だけ」または「文字だけ」を抽出したい場合、
Regex.Replaceメソッドを使って抽出することができる。
using System.Text.RegularExpressions;
string hoge = Regex.Replace (元となる場所, @"[^0-9]", "");
数字以外という正規表現
・前に @ をつける
・“[0-9]” で数字を意味する
・^ をつけることで、〜以外となる
母音を消したい場合、
string hoge = Regex.Replace (元となる場所, @"[aiueo]", "");
で、出来る。
指定した文字が含まれているかどうか
探したい場所.Contains(探したいもの))
で検索することができる。
指定された位置から指定文字数を削除
var fuga = hoge.Remove(n, m);
Console.WriteLine(fuga);
n番目からm個の文字列を削除することができる
重複データかどうかの確認
using System.Linq;
var hoge = "AAAAA";
var fuga = hoge.Distinct().Count();
// fugaは1となり、重複削除後の長さを取得できる
単純に重複データの削除のみ行いたい場合は、
var fuga = hoge.Distinct().ToArray();
で実行できる
float,double,decimalの使い方
doubleの表現精度は14桁までなので15桁以降の数値を扱う場合はdemicalを使用。
floatの時はfをつけるように、demicalの場合はmをつける。
※doubleの時はいらない
demicalは小数何十桁の計算ができ、誤差が許されない勘定計算などに使用する。
ゲームにおける座標計算などのそこまで精密さが求められない、誤差が許される場合に
double/floatなどが使われる。
文字列の挿入
string s = “0123456789”;
// 5文字目の後(インデックスが5の位置)に文字列を挿入する
string s1 = s.Insert(5, “-”);
// s1 は “01234-56789” となる
// s は “0123456789" のまま
配列をint型に変換
using System.Linq;
var hoge = line.Split(’ ’).Select(int.Parse).ToArray();
// .Select(int.Parse).ToArray()で中身をごそっと変換することができる
Discussion