간단한 C 표현식 계산하기
시간 제한1초메모리 제한128 MB
+, -, 전위/후위 ++/--만 있는 간단한 C 수식을 계산하고, 수식의 값과 사용된 각 변수의 최종 값을 출력한다.
문제
이 문제에서는 간단한 C 표현식들을 차례로 계산해야 하지만, 문제를 풀기 위해 C 언어를 알 필요는 없다. 각 표현식은 한 줄에 하나씩 주어지며 길이는 80자를 넘지 않는다. 표현식에는 단순한 정수 변수와 제한된 연산자만 등장하고, 상수는 나타나지 않는다.
표현식에 등장할 수 있는 변수는 a부터 z까지(소문자)의 26개이다. 각 표현식의 계산을 시작하는 시점에 이 26개 변수는 각각 정수 1부터 26까지의 값을 가진다. 즉 a = 1, b = 2, ..., z = 26이다. 한 표현식 안에서 각 변수는 많아야 한 번만 등장하며, 전혀 사용되지 않는 변수도 많을 수 있다.
표현식에 등장하는 연산자는 다음과 같다.
- 이항 연산자
+와-는 일반적인 덧셈, 뺄셈을 의미한다. 예를 들어a + c - d + b의 값은1 + 3 - 4 + 2 = 2이다. - 단항 연산자
++와--는 변수의 앞 또는 뒤에 올 수 있다.++가 변수 앞에 오면(전위), 전체 표현식의 값을 계산할 때 그 변수의 값을 사용하기 전에 변수의 값을 1 증가시킨다. 따라서++c - b의 값은 2이며, 계산 전에c가 4로 증가한다.++가 변수 뒤에 오면(후위), 전체 표현식의 값을 계산하는 데 변수의 값을 사용한 후에 변수의 값을 1 증가시킨다. 따라서c++ - b의 값은 1이지만, 계산이 끝난 뒤c의 값은 4가 된다.--도 같은 방식으로 변수의 앞 또는 뒤에 놓여 변수의 값을 1 감소시킨다. 따라서--c + b--의 값은 4이고, 계산이 끝난 뒤b와c는 각각 1과 2가 된다.
++ 와 -- 를 좀 더 절차적으로 설명하면 다음과 같다(간결함을 위해 ++ 만 설명한다).
- 앞에
++가 붙은 각 변수를 찾는다. 그 변수의 값을 1 증가시키는 대입문을 만들고, 표현식에서 변수 앞의++를 제거한다. - 같은 방식으로 뒤에
++가 붙은 각 변수를 찾는다. 그 변수의 값을 1 증가시키는 대입문을 만들고, 표현식에서 변수 뒤의++를 제거한다. - 이제 표현식에는 어떤 변수에도 앞뒤의
++가 남아 있지 않다. 남은 표현식을 계산하는 문장을 만든다. 이 문장은 1단계에서 만든 문장들 뒤, 2단계에서 만든 문장들 앞에 놓인다. - 1단계의 문장들, 그다음 3단계의 문장, 마지막으로 2단계의 문장을 이 순서대로 실행한다.
이 방식에 따르면 ++a + b++ 를 계산하는 것은 다음과 같다.
a = a + 1(1단계)expression = a + b(3단계)b = b + 1(2단계)
여기서 expression 이 전체 표현식의 값을 받는다.
입력
표현식을 한 줄에 하나씩, 완전히 빈 줄(또는 공백뿐인 줄)이 나올 때까지 읽는다.
표현식을 계산할 때 공백은 무시한다. a+++b 처럼 모호한 표현식(a++ + b 로도, a + ++b 로도 해석될 수 있다)은 입력에 나타나지 않는다. 또한 ++ 나 -- 연산자가 한 변수의 앞과 뒤에 동시에 붙는 일은 없으므로, ++a++ 와 같은 표현식도 입력에 나타나지 않는다.
출력
각 표현식에 대해, 먼저 읽은 그대로의 표현식을 Expression: 뒤에 이어 출력한다. 다음 줄에 전체 표현식의 값을 출력하고, 이어서 표현식에서 사용된 각 변수의 계산 후 값을 한 줄에 하나씩 출력한다. 사용되지 않은 변수는 출력하지 않는다.
값 줄과 각 변수 줄은 공백 4칸으로 들여쓴다. 값 줄의 형식은 value = <값> 이고, 변수 줄의 형식은 <변수> = <값> 이다. 사용된 변수들은 알파벳 순서(a부터 z)로 출력한다.