【C#】プログラミング勉強会
毎月1回、本社でプログラミング勉強会が開催されています。
普段は客先に常駐している他の職員達も、こういうときにだけ本社に集まります。
(まあ、ほんの2~3人ですが・・・)
今回はPaizaのWebサービスを使っての勉強。
上司のSマネージャが進行役です。
今回挑戦した問題は、テキスト文のなかに、同じ文字列が何回出現したかをカウントし、その文字列と出現数を出力させる、というもの。
こうやって説明すると、簡単そうに見えるのですが、思いのほか難儀なプログラムでした…(僕のスキル的に)
みんなで個人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の記述行をコメントアウトしないと、合格になりませんでした。
勉強会は今回で二回目ですが、とても勉強になるので毎月開催してほしいですね。