아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

0으로 나누기 검사기

시간 제한2초메모리 제한512 MB

요약
변수 범위가 주어질 때, 8비트 역폴란드 표기식 평가에서 0으로 나누는 경우가 생기는지 판정한다.
난이도

보통10점 중 6점

유형
스택, 완전 탐색, 구현, 수학
정답자
아직 제출이 없습니다

문제

모리시타 씨는 곤란한 상황에 빠졌습니다. 아네하라 씨에게 프로그램을 하나 받았는데, 그 프로그램이 크래시를 일으키는 것입니다.

아네하라 씨가 써 준 프로그램은 역폴란드 표기법 식을 읽고 계산 결과를 출력하는 프로그램인데, 크래시 로그를 보면 0으로 나눈 것이 원인인 것 같습니다. 모리시타 씨가 잘못된 식을 입력한 탓일 수도 있고, 어쩌면 아네하라 씨가 쓴 프로그램에 버그가 있을 수도 있습니다.

아네하라 씨가 쓴 프로그램을 읽어 보려고 했지만, 아네하라 씨의 프로그램은 어셈블리라는 잘 모르는 말로 쓰여 있어서 보기만 해도 머리가 지끈지끈합니다.

그래서 모리시타 씨는 당신에게 식이 잘못되었는지 조사하는 프로그램을 써 달라고 부탁했습니다. 식이 잘못되었다는 것은, 그 식에 따라 계산하면 0으로 나누는 일이 생길 가능성이 있다는 뜻입니다.

참고로 아네하라 씨가 쓴 코드는 아주 오래된 컴퓨터에서 동작하는데, 사칙연산은 정수로 수행하고 결과는 8비트 부호 없는 정수로 저장됩니다. 예를 들어 255+1은 0이 되고, 3/2는 1이 됩니다.

아, 아네하라 씨에게는 비밀입니다.

(참고) 역폴란드 표기법으로 나타낸 식을 계산하는 의사 코드

s = 빈 스택
n = 식의 요소 수
for i in 1..n:
  if 식의 i번째 요소가 정수:
    s에 그 정수를 푸시한다
  if 식의 i번째 요소가 변수:
    s에 그 변수의 값을 푸시한다
  if 식의 i번째 요소가 연산자:
    s에서 값을 팝하고, b라고 한다
    s에서 값을 팝하고, a라고 한다
    if 연산자가 '+':
      r = (a + b) % 256 으로 한다
    if 연산자가 '-':
      r = (a - b + 256) % 256 으로 한다
    if 연산자가 '*':
      r = (a * b) % 256 으로 한다
    if 연산자가 '/':
      r = (a / b) % 256 으로 한다
    s에 r을 푸시한다
s에서 값을 팝하고, 식의 계산 결과로 한다

입력

m
name1 lb1 ub1
...
namem lbm ubm
n
e1 e2 ... en
  • 0 ≤ m ≤ 100
  • 0 ≤ lbi ≤ ubi ≤ 255
  • 1 ≤ namei (1 ≤ i ≤ m) の 길이 ≤ 20
  • 1 ≤ n ≤ 100
  • m은 변수의 수이고, namei, lbi, ubi는 각각 변수 i의 이름, 하한, 상한을 나타냅니다.
  • n은 식에 포함된 요소의 수를 나타내고, ei는 식의 i번째 요소를 나타냅니다.
  • 각 변수는 식 안에 많아야 한 번 등장합니다.

출력

식이 잘못되었으면 error, 잘못되지 않았으면 correct를 한 줄로 출력하세요.

예제3

  1. 예제 1

    입력
    1
    a 1 10
    3
    10 a /
    
    예상 출력
    correct
    
  2. 예제 2

    입력
    2
    a 1 10
    b 1 10
    5
    1 a b - /
    
    예상 출력
    error
    
  3. 예제 3

    입력
    1
    a 0 255
    7
    1 a 2 * 1 + /
    
    예상 출력
    correct