医療情報男の日記

病院で医療情報システムの保守運用の仕事をしています。

【C#】プログラミング勉強会

毎月1回、本社でプログラミング勉強会が開催されています。
普段は客先に常駐している他の職員達も、こういうときにだけ本社に集まります。
(まあ、ほんの2~3人ですが・・・)


今回はPaizaのWebサービスを使っての勉強。
上司のSマネージャが進行役です。

paiza.jp

今回挑戦した問題は、テキスト文のなかに、同じ文字列が何回出現したかをカウントし、その文字列と出現数を出力させる、というもの。

こうやって説明すると、簡単そうに見えるのですが、思いのほか難儀なプログラムでした…(僕のスキル的に)


みんなで個人PCを持ち寄り、パイザを見ながらプログラムと格闘していました。

配列の概念がよく分かっていないのですが、ListクラスとDictionaryクラスの使い分けが重要だと、Sマネージャから教わりました。
ざっくり言うと、
List = 線形探索法
Dictionary = ハッシュ探索法
ということで良いのかな?


結局、自力で全文書き上げることができず、Sマネージャの模範解答を書き写させてもらい、ようやく完成。

模範解答は、Sマネージャがpaiza.ioにアップしてくださいました。

//単語のカウント (paizaランク C 相当)
//https://paiza.jp/learning/word-count

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

public class Hello {
    public static void Main() {
        var words = new List<string>( Console.ReadLine().Split( ' ' ) );

        //LINQ不使用版
        Main1(words);
        
        Console.WriteLine( "-----" );
        
        //LINQ使用版
        Main2(words);
    }
    
    private static void Main1( List<string> words ) {
        var counts = new Dictionary<string, int>();
        var uniqWords = new List<string>();

        foreach( var word in words ) {
            if( counts.ContainsKey( word ) ) {
                counts[word] += 1;
            }
            else {
                counts.Add( word, 1 );
                uniqWords.Add( word );
            }
        }

        foreach( var word in uniqWords ) {
            Console.WriteLine( string.Format( "{0} {1}", word, counts[word] ) );
        }
    }

    private static void Main2( List<string> words ) {
        var q = from r in
                       from word in words
                       group word by word
                   select new {
                       name = r.Key,
                       count = r.Count()
                   };

        foreach( var v in q ) {
            Console.WriteLine( "{0} {1}", v.name, v.count );
        }

        Console.ReadKey();
    }
}

LINQを使う版と、使わない版とあります。

実際にパイザさんのサイトでCodeを提出するときは、Main1かMain2のどちらかをコメントアウトし、なおかつWritelineの記述行をコメントアウトしないと、合格になりませんでした。

勉強会は今回で二回目ですが、とても勉強になるので毎月開催してほしいですね。