paizaオンラインハッカソン7(#_poh 7)にチャレンジしました!(前編)

こんにちはー!ニアです。

今回は「paizaオンラインハッカソン7」にチャレンジしてみました。

使用した言語はC#です。

まだ解いていない方は、ネタバレに気を付けてね。

1. まずは基本問題(ランクD)からGO!

1.1. E1: 文字列の連結(つり目セット)

文字列「Ann」(POH7のキャラの名前です)を標準入力の値の数だけつなげて出力します。

シンプルに繰り返し文で出力するもよし、C#のstring.Joinメソッドなどであらかじめつなげてから出力するもよしです。

using System;

public class Hello{
    public static void Main(){
        int n = int.Parse( Console.ReadLine() );
        for( int i = 0; i < n; i++ )
            Console.Write( "Ann" );
        Console.WriteLine();
    }
}

1.2. H1 : 和の算出(ショートヘアセット)

標準入力から2つの値を読み取り、その和を出力します。

using System;

class Program {
        static void Main( string[] args ) {
                int a = int.Parse( Console.ReadLine() );
                int b = int.Parse( Console.ReadLine() );
                Console.WriteLine( a + b );
        }
}

1.3. H2: 値の判別(ロングヘアセット)

標準入力から文字列「yes」または「no」を5つ読み取り、多い方の文字列を出力します。

シンプルに読み込んだ文字列と「yes」を比較します。

using System;

class Program {
        static void Main( string[] args ) {
                int y = 0, n = 0;
                for( int i = 0; i < 5; i++ ) {
                        // 読み込んだ文字列が「yes」であればyを、そうでなければnをカウントアップします。
                        if( Console.ReadLine() == "yes" ) y++;
                        else n++;
                }
                // yがnより大きければ「yes」を、そうでなければ「no」を出力します。
                Console.WriteLine( y > n ? "yes" : "no" );
        }
}

◆ ちょっとひと工夫

文字列が「no」であれば、「no」の数をカウントアップする代わりに、「yes」の数をカウントダウンします。すなわち、「yes」の数が正であれば「yes」の方が多く、負であれば「no」の数が多いことになります。

using System;

class Program {
        static void Main( string[] args ) {
                int y = 0;
                for( int i = 0; i < 5; i++ ) {
                        // 読み込んだ文字列が「yes」であればyをカウントアップし、そうでなければyをカウントダウンします。
                        if( Console.ReadLine() == "yes" ) y++;
                        else y--;
                }
                // yが正の数であれば「yes」を、負の数であれば「no」を出力します。
                Console.WriteLine( y > 0 ? "yes" : "no" );
        }
}

また、「yes」「no」は先頭文字だけでも判別できます。特にC言語でchar型配列を使う時に有効です。

using System;

class Program {
        static void Main( string[] args ) {
                int y = 0;
                for( int i = 0; i < 5; i++ ) {
                        // 読み込んだ文字列の先頭が「y」であればyをカウントアップし、そうでなければyをカウントダウンします。
                        if( Console.ReadLine()[0] == 'y' ) y++;
                        else y--;
                }
                Console.WriteLine( y > 0 ? "yes" : "no" );
        }
}

1.4. H3: カウントダウン(ポニーテールセット)

標準入力から値を読み取り、カウントダウンを出力します。

using System;

class Program {
        static void Main( string[] args ) {
                int n = int.Parse( Console.ReadLine() );
                while( n > 0 ) {
                        Console.WriteLine( n-- );
                }
                Console.WriteLine( "0!!" );
        }
}

1.5. H4: 割合の算出(ツインテールセット)

標準入力からカフェインの量と値段を2組読み取り、1円当たりのカフェインの量を求め、コストパフォーマンスの高い方(1か2)を出力します。

整数型で読み取った時は、割り算の時に片方の値を実習型にキャストしましょう。

using System;

class Program {
        static void Main( string[] args ) {
                string[] s = Console.ReadLine().Split( ' ' );
                int c1 = int.Parse( s[0] ), p1 = int.Parse( s[1] );
                s = Console.ReadLine().Split( ' ' );
                int c2 = int.Parse( s[0] ), p2 = int.Parse( s[1] );
                Console.WriteLine( ( double )c1 / p1 >= ( double )c2 / p2 ? 1 : 2 );
        }
}

1.6. C1: 文字列の結合・その2(セーラー服セット)

標準入力から単語の総数と単語を読み取り、単語をアンダーパー「_」でつなげた文字列を出力します。

string.Joinメソッドを使って、セパレーターにアンダーパーを指定し、単語をつなげます。

using System;

class Program {
        static void Main( string[] args ) {
                int n = int.Parse( Console.ReadLine() );
                string[] words = new string[n];
                for( int i = 0; i < n; i++ ) {
                        words[i] = Console.ReadLine();
                }
                Console.WriteLine( string.Join( "_", words ) );
        }
}

1.7. C2: 階乗の算出(カーディガンセット)

標準入力から数値を読み取り、その階乗を出力します。

using System;

class Program {
        static void Main( string[] args ) {
                int n = int.Parse( Console.ReadLine() );
                int ans = 1;
                while( n > 1 ) ans *= n--;
                Console.WriteLine( ans );
        }
}

2. ランクC編

2.1. C3: 文字のパターンを出力(縞ニーソセット)

標準入力から縞の幅と縞模様全体の長さを読み取り、「R」(赤)と「W」(白)で並べた文字列を出力します。

bool型変数1つを用意し、条件判断して文字「R」または「W」を出力し、n個出力する度にtrueとfalseを切り替えます。

using System;

class Program {
        static void Main( string[] args ) {
                int n = int.Parse( Console.ReadLine() );
                int m = int.Parse( Console.ReadLine() );
                bool sw = true;    // true : R / false : W
                while( m > 0 ) {
                        // 文字「R」or「W」をn個出力します。
                        // 但し、mが0になったら、このfor文と外のwhile文から抜け出します。
                        for( int i = 0; i < n && m > 0; i++, m-- ) {
                                Console.Write( sw ? 'R' : 'W' );
                        }
                        // 文字をn個出力する度に、true / falseを切り替えます。
                        sw = !sw;
                }
                Console.WriteLine();
        }
}

またはLINQを使って文字のシーケンス(IEnumerable<char>型)を生成し(Takeメソッドで文字数を指定します)、string.Joinメソッドでつなげます。

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

class Program {
	static void Main( string[] args ) {
		int n = int.Parse( Console.ReadLine() );
		int m = int.Parse( Console.ReadLine() );
		Console.WriteLine( string.Join( "", Stripe( n ).Take( m ) ) );
	}

	static IEnumerable<char> Stripe( int w ) {
		bool sw = true;
		while( true ) {
			for( int i = 0; i < w; i++ ) {
				yield return sw ? 'R' : 'W';
			}
			sw = !sw;
		}
	}
}

2.2. E2: リストの比較・抽出(眼帯)

標準入力から自分が持っている巻番号と古本屋に売られている巻番号を読み取り、古本屋に売られている巻番号の内、自分が持っていないものを巻の小さい順に出力します。

巻番号を格納する配列を作り、LINQのExceptメソッドを使って自分が持っていないものを抽出します。

POH7-E2
using System;
using System.Linq;

class Program {
	static void Main( string[] args ) {
		// 巻の総数を読み取ります。
		int n = int.Parse( Console.ReadLine() );

		// 自分が持っている巻の総数を読み取ります。
		int m1 = int.Parse( Console.ReadLine() );
		// 自分が持っている巻番号を読み取ります。
		int[] m1s = new int[m1];
		string[] s = Console.ReadLine().Split( ' ' );
		for( int i = 0; i < m1; i++ ) {
			m1s[i] = int.Parse( s[i] );
		}

		// 古本屋で売られている巻の総数を読み取ります。
		int m2 = int.Parse( Console.ReadLine() );
		// 古本屋で売られている巻番号を読み取ります。
		int[] m2s = new int[m2];
		s = Console.ReadLine().Split( ' ' );
		for( int i = 0; i < m2; i++ ) {
			m2s[i] = int.Parse( s[i] );
		}

		// LINQのExceptメソッドで古本屋で売られている巻の内、自分の持っていないものを抽出します。
		// ※すべて持っている場合、空のシーケンスとなります。
		var buy = m2s.Except( m1s );

		// シーケンスに要素があれば、昇順ソートして半角スペース区切りで巻番号を出力し、そうでなければ「None」を出力します。
		Console.WriteLine( buy.Any() ? string.Join( " ", buy.OrderBy( _ => _ ) ) : "None" );
	}
}

◆ トラップに注意!

問題ページの入力例では、巻番号が小さい順に並んでいますが、条件の内容より、すべてのテストケースにおいて標準入力での巻番号が小さい順に並ぶとは限りません。対策として結果のリストまたは、自分が持っている巻番号リストと古本屋に売られている巻番号リストを昇順ソートしておきます。

ちなみにこれを忘れると、テストケース2で失敗します。

paizaオンラインハッカソン7(#_poh 7)にチャレンジしました!(後編)」に続きます。

[END]

コメント

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