山傘のプログラミング勉強日記[Java & Unity]

プログラミングに関する日記とどうでもよい雑記からなるブログです。

[yukicoder] No.193 筒の数式

問題

No.193 筒の数式 - yukicoder

考え方

Leading zeroというものが認められているので、 007 = 7 のように変換する必要があります。

また、チェックする文字列の種類は最大でも  |S| です。

例えば、「1 + 42」の文字列の長さは4になるので、

「1+42」

「+431」

「431+」

「31+4」

与えれらた文字列の中で演算子が連続することはないので、得られた文字列の最初と最後に演算子がなければ計算を行うことができます。

計算可能な文字列は中置記法で表現された数式です。この数式を元に計算することもできますが、数字と演算子をキューにいれて解答を導きました。

中置記法 - Wikipedia

コード

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;

public class Exec0193 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String S = scan.next();
        scan.close();
        int l = S.length();
        String ary[] = S.split("");
        int max = Integer.MIN_VALUE;
        for(int i = 0; i < l; i++) {
            String s = "";
            // 前半部分
            for(int j = i; j < l; j++) {
                s += ary[j];
            }
            // 後半部分
            for(int j = 0; j < i; j++) {
                s += ary[j];
            }
            if(!s.substring(0, 1).matches("[0-9]")) {
                continue;
            }
            if(!s.substring(l - 1, l).matches("[0-9]")) {
                continue;
            }
            Deque<String> queue0 = new ArrayDeque<String>();
            Deque<Integer> queue = new ArrayDeque<Integer>();
            String num = "";
            int t0 = 0;
            int index = 0;
            for(int j = 0; j < l; j++) {
                String t1 = s.substring(j, j + 1);
                if(t1.matches("[0-9]")) {
                    num += t1;
                }else {
                    queue0.add(t1);
                    int num1 = zeroToNum(num);
                    num = "";
                    queue.add(num1);
                    index = j;
                }
            }
            int last = zeroToNum(s.substring(index + 1, l));
            queue.add(last);
//         for(int j : queue) {
//             System.out.print(j + " ");
//         }
//         System.out.println();
//         for(String o : queue0) {
//             System.out.print(o + " ");
//         }
//         System.out.println();
//         //System.out.println(index);
//         System.out.println(s);
            //System.out.println(queue0.peek());
            for(String ope : queue0) {
                if(ope.equals("-")) {
                    int num1 = queue.pop();
                    int num2 = queue.pop();

                    t0 = num1 - num2;

                    queue.push(t0);
                }else {
                    int num1 = queue.pop();
                    int num2 = queue.pop();
                    t0 = num1 + num2;
                    queue.push(t0);
                }
            }
            t0 = queue.pop();
            if(max < t0) {
                max = t0;
            }
        }
        System.out.println(max);
    }
    static int zeroToNum(String s) {
        int l = s.length();
        if(l == 1 || !s.substring(0, 1).equals("0")) {
            return Integer.parseInt(s);
        }else {
            for(int i = 1; i < l; i++) {
                char c = s.charAt(i);
                if(c != 0) {
                    String num = s.substring(i, l);
                    return Integer.parseInt(num);
                }
            }
            return 0;
        }
    }
}

感想

ここら辺の内容がきちんと理解できていないので、JavaFXで電卓が作れていない原因の一つかもしれないです。逆ポーランド記法などを理解して、電卓を完成させたいです。