본문 바로가기
코드업(codeup)/C

[코드업(codeup)/C]코드업(codeup) 3127 : 수식 계산 1 C언어

by starfish22 2022. 1. 17.
728x90

▶문제 : 수식 계산 1 (codeup.kr)

 

수식 계산 1

우리가 일상 생활에서 사용하는 수학식은 대부분 중위 표기법이다. 중위 표기법은 어떠한 이항 연산에 대해 연산 대상 사이에 연산자를 표기하는 방식이다. 예를 들면 $ 3 + 5 * 7 $ $ (6 + 9) * 8 $ 등

codeup.kr

 

▶코드 작성

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int num[100], cnt = 0;
    char str[201];
    char *s = str, *temp;

    scanf("%[^\n]s", str);//띄어쓰기 포함 입력

    while (1)
    {
        temp = strchr(s, ' ');//s포인터부터 시작해서 띄어쓰기를 찾음
        if (temp == NULL) break;//띄어쓰기가 없으면 종료
        temp[0] = '\0';//띄어쓰기 부분을 null문자로 바꿈(s포인터를 사용해야하므로)

        if (atoi(s) != 0) num[cnt++] = atoi(s);//s포인터의 문자열이 정수라면 num배열로
        else
        {
            if (s[0] == '+') num[cnt - 2] += num[cnt - 1];//맨 끝에 두 숫자 계산
            else if (s[0] == '-') num[cnt - 2] -= num[cnt - 1];
            else if (s[0] == '*') num[cnt - 2] *= num[cnt - 1];
            cnt--;
        }
        s = temp + 1;//null문자가 있는 부분 + 1을 하여 다음 문자를 대상으로 함
    }

    printf("%d", num[0]);//모든 계산이 끝나면 남은 숫자는 하나이므로 num[0]

    return 0;
}

 

▶해석

scanf로 띄어쓰기 포함하여 문자를 입력받고, temp = strchr(s , ' ');해서 s포인터를 중심으로 띄어쓰기를 찾아갔다. temp가 null이면 띄어쓰기가 없다는 뜻이므로 종료해준다. 띄어쓰기를 찾으면 temp [0]이 띄어쓰기 부분이므로 null문자로 바꿔주어 s포인터를 단독으로 사용할 수 있게 하였다.

atoi함수로 s문자열이 정수인지 판별하여 정수라면 num배열에 넣어주었다.

+, -, *가 나오면 가장 최근에 num배열에 넣은 두 숫자를 계산하는 것이므로 num배열의 길이 cnt를 이용하여 계산하고cnt를 -1 해주었다.

s포인터를 띄어쓰기에 맞춰 다음 문자를 향해 가리켜야 하므로 원래 띄어쓰기였던 temp주소에 +1 하여 다음 문자를 가리켰다. 그렇게 strchr(s , ' ')로 찾아주면 마지막까지 도달할 수 있을 것이다.

모든 계산이 끝나면 num배열에는 하나의 수밖에 남지 않고, 그 자리가 num [0]이다.

728x90

댓글