스프레드시트 순환 참조

시간 제한1초메모리 제한128 MB

요약
스프레드시트 셀 수식이 여러 줄로 주어질 때, 각 셀을 계산하는 과정에서 직접 또는 간접적인 순환 참조가 생기는지 판정해 셀 이름과 circular 또는 ok를 출력한다.
난이도

보통10점 중 4점

유형
그래프, DFS, 문자열
정답자
아직 제출이 없습니다

문제

스프레드시트의 수식 정의가 모순 없이 계산될 수 있는지 판별한다.

스프레드시트의 각 셀에는 다른 셀의 값을 참조하는 수식이 들어갈 수 있다. 어떤 셀의 값을 실제로 계산하기 전에, 그 셀의 수식 정의가 순환(circular)인지 먼저 확인해야 한다.

이 스프레드시트가 다루는 수식(expression)의 문법은 다음과 같이 제한된다.

definition := cell "=" expression
expression := term | expression "+" term | expression " " term
term := factor | term "*" factor | term "/" factor
factor := number | cell | "(" expression ")"
number := digit | number digit
digit := "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
cell := "R" digit digit "C" digit digit

셀의 행과 열 번호는 각각 1부터 20까지 유효하므로, 스프레드시트에는 모두 400개의 셀이 존재한다.

한 셀의 값을 계산하려면 그 수식이 참조하는 모든 셀의 값이 필요하다. 만약 어떤 셀을 계산하는 과정에서 (직접적으로든 간접적으로든) 자기 자신의 값이 다시 필요해지면, 그 셀의 정의는 순환이다.

입력

입력은 한 줄 이상으로 이루어지며, 각 줄은 스프레드시트에 정의된 하나의 셀을 나타낸다. 각 줄은 위 문법의 definition 형식, 즉 cell=expression 꼴이다.

출력

입력에 정의된 각 셀에 대해, 입력에 나타난 순서 그대로 한 줄씩 출력한다. 각 줄에는 먼저 셀 이름을 쓰고, 그 셀을 계산할 때 (직접 또는 간접적으로) 순환 정의가 발생하면 circular를, 순환 없이 계산할 수 있으면 ok를 셀 이름 뒤에 한 칸 띄어 출력한다.

예제3

  1. 예제 1

    입력
    R01C01=1
    R01C02=2
    R01C03=R01C01+R01C02
    R02C01=(R03C02+1)*R01C03
    R03C02=R02C01
    
    예상 출력
    R01C01 ok
    R01C02 ok
    R01C03 ok
    R02C01 circular
    R03C02 circular
    
  2. 예제 2

    입력
    R05C05=R05C05
    
    예상 출력
    R05C05 circular
    
  3. 예제 3

    입력
    R01C01=5
    R01C02=R01C01+3
    R01C03=R01C02*2
    
    예상 출력
    R01C01 ok
    R01C02 ok
    R01C03 ok