問題 - 棒
複数の棒をレーザーで切断しようとしています。効率的な作業のために棒を下から上に重ねておき、レーザーを上から垂直に発射して棒を切ります。棒とレーザーの配置は、以下の条件を満たしています。
一つ、棒は自分より長い鉄の棒の上にのみ置けます。
二つ、棒を他の棒の上に置く場合、完全に含まれるように置きますす。
また、エンドポイントは、重ならないようにします。
三つ、各棒を切るレーザーは、少なくとも一つ存在します。
四つ、レーザーは、いかなる棒の両エンドポイントとも重ならない。
下の図は、上記の条件を満たしている例です。水平に描かれた太い実線は棒であり、点はレーザーの位置、垂直に描かれた点線の矢印はレーザーの発射方向です。
これらのレーザーと棒の配置は
次のように括弧を使用して左から順番に表現することができます。
ーレーザーは、左かっこと右かっこの隣接ペア「()」と表現する。
また、すべての「()」は、必ずレーザーを表現する。
ー棒の左端は、左括弧「(」で、右端は閉じ括弧「)」で表される。
上記の例、括弧の表現は上の図に与えられています。
棒レーザーによっていくつかの部分に切られます。
上記の例では、一番上の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を使ってみました。
댓글 없음:
댓글 쓰기