All Articles

[SWEA] 1233 s/w 문제해결 기본 9일차 - 사칙연산 유효성 검사

[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;
    }