Skip to content

Commit 27bb145

Browse files
committed
수식 복원하기 풀이
1 parent 20532ca commit 27bb145

File tree

1 file changed

+129
-0
lines changed

1 file changed

+129
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
# PCCP 기출문제
2+
# https://school.programmers.co.kr/learn/courses/30/lessons/340210
3+
4+
def transform_10_to_base(num:str, base):
5+
num_int = int(num)
6+
if num_int == 0:
7+
return "0"
8+
res = []
9+
while num_int:
10+
q,r = divmod(num_int, base)
11+
num_int = q
12+
res.append(str(r))
13+
if num_int < base:
14+
res.append(str(num_int))
15+
break
16+
return str(int("".join(res[::-1])))
17+
18+
def solution(expressions):
19+
split_expressions = [e.split() for e in expressions]
20+
possible_base = list(range(2, 10))
21+
22+
# 1. 불가능한 진법은 제거하기
23+
for exp in split_expressions:
24+
if exp[-1] == "X":
25+
continue
26+
27+
remove_base = []
28+
num1, op, num2, _, res = exp
29+
for base in possible_base:
30+
try:
31+
_num1 = int(num1, base)
32+
_num2 = int(num2, base)
33+
except:
34+
remove_base.append(base)
35+
continue
36+
37+
if op == "+":
38+
base_res = transform_10_to_base(str(int(_num1) + int(_num2)), base)
39+
else:
40+
base_res = transform_10_to_base(str(int(_num1) - int(_num2)), base)
41+
42+
if base_res != res:
43+
remove_base.append(base)
44+
45+
for rb in remove_base:
46+
possible_base.remove(rb)
47+
48+
predict = []
49+
remove_base = set() # 불가능한 진법이 있는 경우, 예측된 다른 결과에서도 제거하기 위함
50+
# 2. 가능한 진법으로 변환하기
51+
for exp in split_expressions:
52+
if exp[-1] != "X":
53+
continue
54+
55+
pred_result = [set()]
56+
num1, op, num2, _, res = exp
57+
for base in possible_base:
58+
try:
59+
_num1 = int(num1, base)
60+
_num2 = int(num2, base)
61+
except:
62+
remove_base.add(base)
63+
continue
64+
65+
if op == "+":
66+
base_res = transform_10_to_base(str(int(_num1) + int(_num2)), base)
67+
else:
68+
base_res = transform_10_to_base(str(int(_num1) - int(_num2)), base)
69+
70+
pred_result[0].add(base)
71+
pred_result.append((base_res, base))
72+
73+
predict.append(pred_result)
74+
75+
# 3. 불가능한 진법에 대한 결과 삭제하기
76+
for pred_result in predict:
77+
for base in remove_base:
78+
if base in pred_result[0]:
79+
for p in pred_result[1:]:
80+
if p[1] == base:
81+
pred_result.remove(p)
82+
pred_result[0].remove(base)
83+
84+
# 4. 결과 출력하기
85+
answer = []
86+
idx = -1
87+
for exp in split_expressions:
88+
if exp[-1] != "X":
89+
continue
90+
91+
idx += 1
92+
num1, op, num2, _, _ = exp
93+
pred = predict[idx]
94+
pred_list = pred[1:]
95+
96+
all_same = set()
97+
for p in pred_list:
98+
all_same.add(p[0])
99+
100+
if len(all_same) == 1:
101+
answer.append(f"{num1} {op} {num2} = {pred_list[0][0]}")
102+
continue
103+
else:
104+
answer.append(f"{num1} {op} {num2} = ?")
105+
106+
return answer
107+
108+
expressions = [
109+
["14 + 3 = 17", "13 - 6 = X", "51 - 5 = 44"],
110+
["1 + 1 = 2", "1 + 3 = 4", "1 + 5 = X", "1 + 2 = X"],
111+
["10 - 2 = X", "30 + 31 = 101", "3 + 3 = X", "33 + 33 = X"],
112+
["2 - 1 = 1", "2 + 2 = X", "7 + 4 = X", "5 - 5 = X"],
113+
["2 - 1 = 1", "2 + 2 = X", "7 + 4 = X", "8 + 4 = X"]
114+
]
115+
116+
result = [
117+
["13 - 6 = 5"],
118+
["1 + 5 = ?", "1 + 2 = 3"],
119+
["10 - 2 = 4", "3 + 3 = 10", "33 + 33 = 110"],
120+
["2 + 2 = 4", "7 + 4 = ?", "5 - 5 = 0"],
121+
["2 + 2 = 4", "7 + 4 = 12", "8 + 4 = 13"]
122+
]
123+
124+
for q in [0,1,2,3,4]:
125+
qid = solution(expressions[q])
126+
if qid == result[q]:
127+
print(f'correct {qid}')
128+
else:
129+
print(f'incorrect {qid}')

0 commit comments

Comments
 (0)