[SWEA] 1233 s/w 문제해결 기본 9일차 - 사칙연산 유효성 검사 - python, c
python이 c에 비해 확연히 구현이 쉽다.
python은 한 리스트 안에 type에 관계 없이 - 숫자, 문자열- 집어넣을 수 있기 때문에 트리의 구현이 용이하다.
C에서 다른 타입의 문자를 넣기 위해 구조체를 사용했다.
식을 정렬하기 위해 중위순회를 사용하며 재귀함수를 통해 구현한다.
-
python
def inorder(node): if node: inorder(tree[node][2]) formula.append(tree[node][1]) inorder(tree[node][3]) for tc in range(10): n = int(input()) tree = [[0 for _ in range(4)] for _ in range(n+1)] for line in range(n): tmp = list(input().split()) index = int(tmp[0]) tree[index][0] = index if len(tmp)>=3: tree[index][2] = int(tmp[2]) if len(tmp) == 4: tree[index][3] = int(tmp[3]) # if tmp[1] in ['-', '+', '*', '/']: # tree[index][1] = tmp[1] # else: # tree[index][1] = int(tmp[1]) tree[index][1] = tmp[1] formula = [] inorder(1) result = 1 for i in range(len(formula)): if not i%2: if ord(formula[i])<48 or ord(formula[i])>=58: result = 0 break else: if formula[i] not in ['-', '+', '*', '/']: result = 0 break print(f"#{tc + 1} {result}")
-
c
#include <stdio.h> int n, half; int number, l, r; char data; typedef struct Tree { char data; int left, right; }Tree; Tree tree[210]; char formula[210]; int index; int result; void inorder(int node) { if (node) { inorder(tree[node].left); formula[index++] = tree[node].data; inorder(tree[node].right); } } int main(void) { for (int tc = 1; tc <= 10; tc++) { scanf("%d", &n); half = n / 2; tree[210]; for (int num = 1; num <= n; num++) { if (num < half) { scanf("%d %c %d %d", &number, &data, &l, &r); tree[num].data = data; tree[num].left = l; tree[num].right = r; } else if (num == half) { if (n % 2) { scanf("%d %c %d %d", &number, &data, &l, &r); tree[num].data = data; tree[num].left = l; tree[num].right = r; } else { scanf("%d %c %d", &number, &data, &l); tree[num].data = data; tree[num].left = l; tree[num].right = 0; } } else { scanf("%d %c", &number, &data); tree[num].data = data; tree[num].left = 0; tree[num].right = 0; } //printf("%d %c %d %d\n", num, tree[num].data, tree[num].left, tree[num].right); } index = 0; inorder(1); result = 1; for (int i = 0; i < index; i++) { if (i % 2) { if (formula[i] != '+' && formula[i] != '-' && formula[i] != '*' && formula[i] != '/') { result = 0; break; } } else { if (formula[i] < '0' || formula[i]>'9') { result = 0; break; } } } printf("#%d %d\n", tc, result); } return 0; }