paizaオンラインハッカソン6(緑川編・六村編)を解いてみたよ

Myoga-SB-SDF-A2

Hello~! ミョウガです!

今回は「paizaオンラインハッカソン6」でプログラミングしてみました。

paizaオンラインハッカソン6には3種類の問題があるけど、ここでは緑川さんと六村さんの方をチョイスします。

https://paiza.jp/poh/joshibato/tsubame

https://paiza.jp/poh/joshibato/rio

霧島編はニアが書いたQiitaの記事を参照してね。

[C# / paiza POH] paizaオンラインハッカソン6(霧島編)を解く!

http://qiita.com/nia_tn1012/items/25bc3dcb0fb3343d5509

1. 緑川編を解く

まずは緑川編です。

2桁のランダムな数字Nを読み取り、NとNの十の位とNの一の位の和を求めます。

2桁の数字の場合、十の位は10で割った商、一の位は10で割った余りとなります。

using System;

class Program {

	static void Main( string[] args ) {

		int n = int.Parse( Console.ReadLine() );
		Console.WriteLine( n + n / 10 + n % 10 );
		
	}

}

実行結果

◆ 入力

97

◆ 出力

113

2. 六村編を解く

次は六村編だよ。

操作番号Mと量Qを読み取り、操作番号に応じて以下の3種類の操作を行います。コーヒーカップ内のお湯の量を W [g]、コーヒー粉末の量を P [g] とします。

  1. コーヒーカップにお湯を Q [g] 入れます。( W ← W + Q )
  2. コーヒーカップにコーヒー粉末を Q [g] 入れます。( P ← P + Q )
  3. コーヒーカップの中身を Q [g] 飲みます。( ( W, P ) ← ( W – Q × W / ( W + P ), P – Q × P / ( W + P ) ) )

この操作をN回行い、最終的なコーヒーの濃度( P / ( W + P ) × 100 [%] )を求めます。

これは操作番号Mをswitch文で分岐して、それぞれのcaseでお湯やコーヒー粉末を増やしたり、減らしたりすることで求まります。

using System;

struct CoffeeCup {
	// コーヒー粉末
	public double Coffee;
	// お湯
	public double Water;
}

class Program {

	static void Main( string[] args ) {

		CoffeeCup key = new CoffeeCup{ Coffee = 0.0, Water = 0.0 };

		int n = int.Parse( Console.ReadLine() );
		string[] s;
		for( int i = 0; i < n; i++ ) {

			s = Console.ReadLine().Split( ' ' );

			switch( int.Parse( s[0] ) ) {
				case 1:     // お湯を追加
					key.Water += int.Parse( s[1] );
					break;
				case 2:		// コーヒー粉末を追加
					key.Coffee += int.Parse( s[1] );
					break;
				case 3:		// 味見
					int c = int.Parse( s[1] );
					double total = key.Coffee + key.Water;
					key.Coffee -= c * key.Coffee / total;
					key.Water -= c * key.Water / total;
					break;
				default:
					break;
			}
		}

		// コーヒーの濃度を出力します。
		Console.WriteLine( Math.Floor( key.Coffee / ( key.Coffee + key.Water ) * 100 ) );

	}

}

実行結果

◆ 入力

4
1 50
2 55
3 15
1 20

◆ 出力

42

ここで気をつけておきたいのが、31~33行目にある「味見」操作の処理です。式の右辺にあるお湯とコーヒー粉末の量は味見する前の値を使います。もし、case 3を以下のコードにしてしまうと、味見した後のコーヒーの量を使ってお湯の量を計算するので、正しくない値になります。ケアレスミスに気をつけてね!

case 3:		// 味見
	int c = int.Parse( s[1] );
	key.Coffee -= c * key.Coffee / ( key.Coffee + key.Water );
	key.Water -= c * key.Water / ( key.Coffee + key.Water );
	break;

対策としては、味見前のお湯またはコーヒー粉末の量をキャッシュしておく、予めお湯とコーヒー粉末の和を別の変数に格納する、タプルなどを使って計算する方法があります。

ではでは、See you♪

コメント

タイトルとURLをコピーしました