Post Page Advertisement [Top]

この問題はこのURLを翻訳した問題です。



問題 - 

複数の棒をレーザーで切断しようとしています。効率的な作業のために棒を下から上に重ねておき、レーザーを上から垂直に発射して棒を切ります。棒とレーザーの配置は、以下の条件を満たしています。

一つ、棒は自分より長い鉄の棒の上にのみ置けます。
二つ、棒を他の棒の上に置く場合、完全に含まれるように置きますす。
また、エンドポイントは、重ならないようにします。
三つ、各棒を切るレーザーは、少なくとも一つ存在します。
四つ、レーザーは、いかなる棒の両エンドポイントとも重ならない。

下の図は、上記の条件を満たしている例です。水平に描かれた太い実線は棒であり、点はレーザーの位置、垂直に描かれた点線の矢印はレーザーの発射方向です。


これらのレーザーと棒の配置は
次のように括弧を使用して左から順番に表現することができます。

ーレーザーは、左かっこと右かっこの隣接ペア「()」と表現する。
また、すべての「()」は、必ずレーザーを表現する。
ー棒の左端は、左括弧「(」で、右端は閉じ括弧「)」で表される。

上記の例、括弧の表現は上の図に与えられています。

棒レーザーによっていくつかの部分に切られます。
上記の例では、一番上の2つの棒はそれぞれ三つと二つの部分に切られて、
このような方法で指定された棒は合計17個に切られます。

棒タイルレーザーの配置を示す括弧表現が与えられた時
棒の合計数を計算するプログラムを作成してください。

例1
入力:()(((()())(())()))(())
出力:17

例2
入力:(((()(()()))(())()))(()())
出力:24




下は私の答案です。

public class algo {
    public static void main(String[] args) {

        int stickNum = 0;
        int sum = 0;

        Scanner sc = new Scanner(System.in);
        String temp = sc.nextLine();
        char stickString[] = temp.toCharArray();

        int i = 0;
        do {
            switch (stickString[i]) {
                case '(':
                    stickNum++;
                    break;
                case ')':
                    if (stickString[i - 1] == '(') {
                        stickNum--;
                        sum += stickNum;
                    } else if (stickString[i - 1] == ')') {
                        stickNum--;
                        sum++;
                    } else {
                        System.out.println("Error");
                    }
                    break;
                default:
                    System.out.println("Error");
                    break;
            } // end switch
            i++;
        } while (i < temp.length());
        System.out.println("Sum: " + sum);
    }
}

forと ifに慣れて他の方法を忘れそうで
do whileとSwitchを使ってみました。

댓글 없음:

댓글 쓰기

Bottom Ad [Post Page]

| Designed by Colorlib