Mapmaker

면접 대비

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

요약
배열 선언의 경계와 원소 크기를 읽고, 각 참조의 물리 주소를 행 우선 주소 공식으로 계산한다.
난이도

보통10점 중 4점

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

문제

사이버소프트 컴퓨터 회사(프로그래밍 언어 분야의 선두 기업)가 A-- 라는 새 프로그래밍 언어의 배열 주소 계산 기능을 맡기기 위해 여러분을 고용했다. 여러분이 할 일은 x[5, 6] 과 같은 배열 참조를 실제 물리 주소로 변환하는 것이다. 이를 위해 여러 개의 배열 선언과 참조를 읽어 각 참조의 물리 주소를 출력하는 프로그램을 작성한다. 모든 물리 주소는 10진 정수로 출력한다.

배열 참조 A[i1,i2,…,iD]A[i_1, i_2, \ldots, i_D] 의 물리 주소는 다음 식으로 계산한다.

C0+C1i1+C2i2+⋯+CDiDC_0 + C_1 i_1 + C_2 i_2 + \cdots + C_D i_D

여기서 상수 C0,…,CDC_0, \ldots, C_D 는 아래와 같이 정의된다.

  • BB = 배열의 기준 주소(base address)
  • DD = 배열의 차원 수
  • LdL_d = dd번째 차원의 하한
  • UdU_d = dd번째 차원의 상한
  • CDC_D = 배열 원소 하나의 크기(바이트)
  • 1≤d<D1 \le d < D 에 대해 Cd=Cd+1 (Ud+1−Ld+1+1)C_d = C_{d+1}\,(U_{d+1} - L_{d+1} + 1)
  • C0=B−C1L1−C2L2−⋯−CDLDC_0 = B - C_1 L_1 - C_2 L_2 - \cdots - C_D L_D

입력

첫째 줄에 두 양의 정수 NN 과 RR 이 주어진다. NN 은 선언되는 배열의 개수이고, RR 은 주소를 계산해야 하는 배열 참조의 개수이다. 이어지는 NN 개의 줄에는 배열이 한 줄에 하나씩 선언되고, 그다음 RR 개의 줄에는 계산할 배열 참조가 한 줄에 하나씩 주어진다.

각 배열 선언 줄에는 순서대로 다음이 주어진다: 배열 이름(최대 10글자), 배열의 기준 주소를 나타내는 양의 정수, 각 원소의 크기(바이트)를 나타내는 양의 정수, 그리고 차원 수 DD (1≤D≤101 \le D \le 10). 그 뒤에는 같은 줄에 DD 개의 정수 쌍이 이어지며, 이는 각각 차원 1,…,D1, \ldots, D 의 하한과 상한을 나타낸다.

각 배열 참조 줄에는 배열 이름과, 그에 이어 정수 인덱스 i1,i2,…,iDi_1, i_2, \ldots, i_D 가 주어진다. 여기서 DD 는 해당 배열의 차원 수이다.

출력

각 참조마다 한 줄에 그 참조와 물리 주소를 함께 출력한다. 형식은 정확히 다음을 따른다.

  1. 배열 이름을 출력한다.
  2. 왼쪽 대괄호 [ 를 출력한다.
  3. 인덱스 값들을 출력하되, 이웃한 두 인덱스 사이는 쉼표와 공백 하나로 구분한다.
  4. 오른쪽 대괄호, 공백, 등호, 공백을 차례로 출력한다 (] = ).
  5. 물리 주소를 출력한다.

예제2

  1. 예제 1

    입력
    3 4
    ONE    1500 2 2 0 3 1 5
    TWO    2000 4 3 1 4 0 5 5 10
    THREE  3000 1 1 1 9
    ONE    2 4
    THREE  7
    TWO    2 0 6
    TWO    3 3 9
    
    예상 출력
    ONE[2, 4] = 1526
    THREE[7] = 3006
    TWO[2, 0, 6] = 2148
    TWO[3, 3, 9] = 2376
    
  2. 예제 2

    입력
    1 1
    A 100 4 1 0 9
    A 5
    
    예상 출력
    A[5] = 120