버그 찾기

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

요약
배열 선언과 대입문으로 이루어진 간단한 프로그램을 한 줄씩 실행하며 인덱스 범위 오류나 미할당 원소 참조가 처음 발생하는 줄 번호를 찾습니다.
난이도

보통10점 중 5점

유형
시뮬레이션, 구현, 배열
정답자
아직 제출이 없습니다

문제

이 문제에서는 1차원 정수 배열의 선언과 대입문만을 가진 간단한 프로그래밍 언어를 다룬다. 주어진 프로그램에서 버그를 찾는 것이 목표다.

이 언어의 문법을 BNF로 나타내면 다음과 같다.

       <program> ::= <declaration> | <program><declaration> | <program><assignment>
   <declaration> ::= <array name>[<number>]<new line>
    <assignment> ::= <array name>[<expression>]=<expression><new line>
    <expression> ::= <number> | <array name>[<expression>]
        <number> ::= <digit> | <digit_positive><digit_string>
  <digit_string> ::= <digit> | <digit><digit_string>
<digit_positive> ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
         <digit> ::= 0 | <digit_positive>
    <array_name> ::= a | b | c | d | e | f | g | h | i | j | k | l | m |
                     n | o | p | q | r | s | t | u | v | w | x | y | z |
                     A | B | C | D | E | F | G | H | I | J | K | L | M |
                     N | O | P | Q | R | S | T | U | V | W | X | Y | Z

여기서 <new line>은 하나의 줄바꿈 문자(LF)이다. 프로그램에 나타나는 문자는 알파벳 글자, 십진 숫자, =, [, ], 그리고 줄바꿈 문자뿐이며, 그 밖의 문자는 나타나지 않는다.

선언은 배열을 선언하고 그 길이를 지정한다. 길이가 nn인 배열의 유효한 인덱스는 00부터 n−1n - 1까지의 정수다. 배열 이름은 대소문자를 구분하므로 배열 a와 배열 A는 서로 다른 배열이다. 갓 선언된 배열의 각 원소의 초깃값은 정의되지 않은 상태다. 예를 들어 길이가 1010인 배열 a와 길이가 55인 배열 b는 다음과 같이 선언한다.

a[10]
b[5]

식(expression)은 음이 아닌 정수로 평가된다. <number>는 십진 정수로 해석되며, <array name>[<expression>]은 그 배열에서 인덱스가 <expression>의 값인 원소에 저장된 값으로 평가된다. 대입문은 오른쪽 값을 왼쪽에서 가리키는 배열 원소에 저장한다. 대입문의 예는 다음과 같다.

a[0]=3
a[1]=0
a[2]=a[a[1]]
a[a[0]]=a[1]

프로그램은 첫 줄부터 한 줄씩 실행된다. 모든 배열은 그 원소가 대입되거나 참조되기 전에 정확히 한 번 선언된다고 가정해도 좋다.

프로그램이 주어질 때, 다음 버그를 찾으시오.

  • 배열이 유효하지 않은 인덱스로 접근된다.
  • 대입문에서, 아직 값이 대입되지 않은 배열 원소가 배열의 인덱스나 저장할 값으로 참조된다.

구문 오류 같은 다른 종류의 버그는 나타나지 않는다고 가정해도 좋다. 또한 <number>로 표기되는 모든 정수는 00 이상 231−1=21474836472^{31} - 1 = 2147483647 이하라고 가정해도 좋다.

입력

입력은 여러 개의 데이터셋으로 이루어지며, 마지막에는 오직 하나의 .(마침표)만 있는 줄이 온다. 각 데이터셋은 하나의 프로그램이며, 마찬가지로 그 뒤에 오직 하나의 .(마침표)만 있는 줄이 온다. 프로그램은 최대 10001000줄이며, 줄바꿈 문자를 제외한 각 줄의 길이는 8080자를 넘지 않는다.

출력

각 프로그램에 대해, 첫 번째 버그가 나타나는 대입문의 줄 번호를 출력한다. 줄 번호는 각 프로그램마다 11부터 시작한다. 프로그램에 버그가 없으면 00을 출력한다. 출력에는 공백과 같은 불필요한 문자가 포함되어서는 안 된다.

예제1

  1. 예제 1

    입력
    a[3]
    a[0]=a[1]
    .
    x[1]
    x[0]=x[0]
    .
    a[0]
    a[0]=1
    .
    b[2]
    b[0]=2
    b[1]=b[b[0]]
    b[0]=b[1]
    .
    g[2]
    G[10]
    g[0]=0
    g[1]=G[0]
    .
    a[2147483647]
    a[0]=1
    B[2]
    B[a[0]]=2
    a[B[a[0]]]=3
    a[2147483646]=a[2]
    .
    .
    
    예상 출력
    2
    2
    2
    3
    4
    0