paiza c# 個人用メモ


はじめに

完全にメモです。
新しい言語に触るとき、paizaでコーディングテストを数回することが多く、どうせなら個人用にメモを取っておこうと書いてます。
今回はc#です。アルゴリズムが整ってないせいだと思いますが(苦笑)、Sランク問題では速度が足りない(タイムオーバー)ことが多かった。
@問題が分かってしまうようなことは一切記載しないです。

雛形

using System;
using System.Linq;
using System.Collections.Generic;

public class PaizaTest{
    public static void Main(){
        // 入力時に空白で区切られた文字列を配列に格納
        // ⇒ 配列に格納された文字をint型に変換
        // ⇒ 変換時にListになるため配列に変換
        var line = Console.ReadLine().Trim().Split(' ').Select(s => int.Parse(s)).ToArray();
        Console.WriteLine();
    }
}

コーディングテストの入出力って結構面倒、、、c言語のようなscanfがあればいいんだけどなぁ。
動作速度上げるなら、入出力も自作するべき。(階層の低い方法で)

・標準入力
Console.Read();        //1文字入力
Console.ReadLine();      //1行入力
・標準出力
Console.Write("改行なし a = {0} b = {1} c = {2}", a, b, c);     //改行なし出力
Console.WriteLine("改行あり a = {0} b = {1} c = {2}", a, b, c);    //改行付き出力

refキーワード(参照渡し)

// 呼び出し
Judge(str, ref num);    //呼び出し元にも必要

// 関数
public static void Judge(string str, ref int num){} 

※当たり前だが、もともと参照渡しの配列とかには不要

多次元配列

・1次元配列に変換

//・2次元配列を1次元にする
int[,] array;
var result = array.Cast<int>();

//・ジャグ配列を1次元にする
int[][] array; 
int[] result = array.SelectMany(x => x).ToArray();

ただ、そもそも多次元配列を使うためのコストが非常に高い。速度を早くするためのリファクタをすると結局1次元になってしまう...可読性えぇ(速度をアルゴリズムでなんとか出来ればいいんだが)

・1次元配列を2次元配列のように扱う
-入力

var list = new List<int>();
        for(int i=0; i<len; i++){
            list.AddRange(Console.ReadLine().Trim().Split(' ').Select(s => int.Parse(s)).ToArray());
        }
        var array = list.ToArray();

-使用

array[h*wLength + w];  // 場合によっては[(h-1)*wLength + (w-1)]

面倒な入力

入力時に空白文字などの区切り文字があればsplitで分けることができるが、連続した文字が来ると面倒。ほんと

他にいいやり方がありそうだが、とりあえずの雛形

・文字列から1文字ずつ取得(正しいか未確認)

string s;
for (int i = 0; i < str.Length; i++) string s += str.Substring(i, 1);

・動作時の型を取得
.GetType())

・linq(メソッド構文)
var count = Line.Count(v => v % 2 == 0);

・絶対値
Math.Abs();

おわりに

感想程度ですが。
イテレータの最大回数や効率、短い時間でのアルゴリズム・可読性・リファクタ、出力後の動作速度の可視化とかできる競技プログラミングサイトって勉強し始めにはかなり使えると思います。