자바생
article thumbnail
728x90

오답 노트 & 새로 알게 된 점

이 문제를 푸는데 6시간이 걸린 듯 하다.

총 23트 끝에 문제를 맞게 됐다. 진짜 끔찍하고 무시무시했던 문제였다.

 

문제를 정리해보면

1. 숫자를 문자열로 풀어서 입력을 줌 

2. 문자열을 숫자로 변환하여 계산을 함

3. 계산된 값을 다시 문자열로 풀어야 함

 

처음에 문자열을 완탐하면서 연산을 배열에 넣어줬다.

왜?

연산의 갯수가 숫자문자열의 개수보다 많다면 잘못된 수식임을 판별하기 위해서이다.

 

StringTokenizer를 이용하여 연산자를 구분자로 문자열을 파싱하면서,

정답을 출력하기 위해 Stringbuilder에 값을 넣어주면서, 숫자를 변환하여 덱에 넣어주었다.

 

덱에 넣어준 이유는 값을 계산하기 위해서이다

-> 근데 왜 덱을 사용했을까?

-> 계산하기 위해서는 두 개의 숫자가 필요하다. 또한, 앞에서부터 계산한다고 했으므로

두 개의 숫자를 꺼낸 뒤에, 계산한 값을 다시 제일 앞에 넣어주면서 순차적으로 계산하기 위함이다.

 

 

나의 코드를 그림으로 정리해봤다.

주석에 있는 숫자 순서대로 이해하면 된다.

다만, 덱에 있는 계산식은 코드를 보면서 이해하는게 좋다.

덱의 원소의 개수가 하나가 될 때까지 계속해서 계산해나간다.

 

아래는 문제 예제 4번이다.

 


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
import java.io.*;
import java.util.*;
 
public class Main {
    static Long atoi(String str) {
        return Long.parseLong(str);
    }
 
    static HashMap<StringString> hm = new HashMap<>();
    static String s;
    static ArrayList<Character> op = new ArrayList<>();
    static StringBuilder sb = new StringBuilder();
    static Deque<Long> dq = new ArrayDeque<>();
    public static void main(String[] args) throws IOException {
        input();
        pro();
 
        System.out.println(sb);
    }
 
    static void pro() {
        StringTokenizer st = new StringTokenizer(s, "+-x/=");
 
        if(st.countTokens() < op.size()){
            sb.append("Madness!");
            return;
        }
 
        int opIdx = 0;
        long sum = 0L;
 
        //1
        while (st.hasMoreTokens()) {
            String rel = stringToNum(st.nextToken());
 
            if(rel == null){
                sb.append("Madness!");
                return;
            }
 
            sb.append(rel).append(op.get(opIdx++));
            dq.offer(atoi(rel));
        }
 
        sb.append("\n");
 
        //2
        opIdx = 0;
        while (dq.size() >= 2) {
            long l1 = dq.poll();
            long l2 = dq.poll();
 
            long rel = calcul(l1, l2, op.get(opIdx));
            opIdx++;
            dq.offerFirst(rel);
        }
 
 
        //3
        long l = dq.poll();
        sb.append(numToString(l));
 
    }
 
    static String numToString(Long l) {
        String strL = String.valueOf(l);
        String rel = "";
        for (int i = 0; i < strL.length(); i++) {
            if(strL.charAt(i) == '+' || strL.charAt(i) == '-' || strL.charAt(i) == 'x' ||
                    strL.charAt(i) == '/' || strL.charAt(i) == '='){
                rel += strL.charAt(i);
            }
            else rel += hm.get(strL.charAt(i) + "");
        }
 
        return rel;
    }
 
    static Long calcul(long l1, long l2, char op) {
        long rel = 0L;
        switch (op) {
            case '+':
                rel = l1 + l2;
                break;
            case '-':
                rel = l1 - l2;
                break;
            case 'x':
                rel = l1 * l2;
                break;
            case '/':
                rel = l1 / l2;
                break;
        }
        return rel;
    }
 
    static String stringToNum(String target) {
        String rel = "";
        String num = "";
        int s = 0, e = 0;
 
        while (true) {
            e++;
            String mid = target.substring(s, e);
            if (hm.get(mid) != null) {
                rel += mid;
                num += hm.get(mid);
                s = e;
            }
            if(e == target.length()) break;
        }
 
        if(rel.length() == target.length()) return num;
        return null;
 
    }
 
    static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        s = br.readLine();
 
        for (int i = 0; i < s.length(); i++) {
            if(s.charAt(i) == '+' || s.charAt(i) == '-' ||s.charAt(i) == 'x' ||
                    s.charAt(i) == '/' || s.charAt(i) == '='){
                op.add(s.charAt(i));
            }
        }
 
        hm.put("ZERO""0");
        hm.put("ONE""1");
        hm.put("TWO""2");
        hm.put("THREE""3");
        hm.put("FOUR""4");
        hm.put("FIVE""5");
        hm.put("SIX""6");
        hm.put("SEVEN""7");
        hm.put("EIGHT""8");
        hm.put("NINE""9");
 
        hm.put("0""ZERO");
        hm.put("1""ONE");
        hm.put("2""TWO");
        hm.put("3""THREE");
        hm.put("4""FOUR");
        hm.put("5""FIVE");
        hm.put("6""SIX");
        hm.put("7""SEVEN");
        hm.put("8""EIGHT");
        hm.put("9""NINE");
    }
}
cs

728x90

'BOJ(Java)' 카테고리의 다른 글

자바(백준) 1719 택배  (0) 2021.12.28
자바(백준) 1261 알고스팟  (0) 2021.12.28
자바(백준) 10423 전기가 부족해  (0) 2021.12.22
자바(백준) 1647 도시 분할 계획  (0) 2021.12.22
자바(백준) 16398 행성 연결  (0) 2021.12.22
profile

자바생

@자바생

틀린 부분이 있다면 댓글 부탁드립니다~😀

검색 태그