만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

YAML

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

요약
들여쓰기로 표현된 작은 YAML 형식의 중첩 객체를 파싱한 뒤 점으로 구분된 질의 경로를 따라가서 값이 문자열인지 객체인지 없는 속성인지 판별한다.
난이도

보통10점 중 4점

유형
문자열, 구현, 스택, 해시맵
정답자
아직 제출이 없습니다

문제

YAML (YAML Ain't Markup Language)은 오브젝트를 문자열로 표현하는 형식 중 하나다.

YAML의 부분집합으로 표현된 오브젝트와 프로퍼티를 지정하는 쿼리가 주어지면, 지정된 프로퍼티의 값을 출력하라.

YAML의 부분집합

YAML의 부분집합은 다음 확장 BNF 표기법으로 표현되는 문법 규칙을 따른다.

yaml: mapping(0)
mapping(n): mapping-item(n) | mapping-item(n) mapping(n)
mapping-item(n): indent(n) key ':' ' ' string '\n'
                 | indent(n) key ':' '\n' mapping(m) (단, m>n)
key: [a-z0-9]+ (영소문자 또는 숫자로 이루어진 1자 이상의 문자열)
string: [a-z0-9 ]+ (영소문자, 숫자 또는 공백으로 이루어진 1자 이상의 문자열)
indent(0): "" (빈 문자열)
indent(n+1): ' ' indent(n) (공백을 n+1개 나열한 문자열)

'\n'은 줄바꿈 문자를 나타낸다.

mapping(n)은 오브젝트를 나타내고, mapping(n)에 포함된 mapping-item(n)은 오브젝트에 포함된 프로퍼티를 나타낸다.

mapping-item(n): indent(n) key ':' ' ' string '\n'은 key로 표현되는 프로퍼티의 값이 string으로 표현되는 문자열임을 나타낸다.

mapping-item(n): indent(n) key ':' '\n' mapping(m)은 key로 표현되는 프로퍼티의 값이 mapping(m)으로 표현되는 오브젝트임을 나타낸다.

한 오브젝트에 같은 key를 갖는 프로퍼티가 둘 이상 포함되지는 않는다.

프로퍼티를 지정하는 쿼리의 형식

프로퍼티를 지정하는 쿼리는

.key_1.key_2(..생략..).key_n

처럼 '.'과 key가 번갈아 나타나는 형태로 주어지며, 이는 "yaml로 주어진 오브젝트에서 key1이라는 key를 갖는 프로퍼티의 값인 오브젝트에서 key2라는 key를 갖는 프로퍼티의 값인 오브젝트에서, (..생략..) keyn이라는 key를 갖는 프로퍼티"를 나타낸다.

어떤 i(1 ≤ i ≤ n - 1)에 대해 .key_1.key_2.(..생략..).key_i까지로 표현되는 프로퍼티의 값이 오브젝트가 아니거나, 오브젝트이지만 key_i+1이라는 프로퍼티를 포함하지 않으면, .key_1.key_2(..생략..).key_n으로 표현되는 프로퍼티는 존재하지 않는 것으로 본다.

입력

.key_1.key_2(...).key_n
yaml
  • 1 ≤ n ≤ 20
  • 입력 전체에 포함된 문자 수 ≤ 50,000

출력

프로퍼티의 값을 한 줄로 출력하라.

지정된 프로퍼티가 존재하지 않으면 no such property, 프로퍼티의 값이 오브젝트이면 object, 프로퍼티의 값이 문자열이면 string "<문자열의 내용>"을 출력하라.

예제5

  1. 예제 1

    입력
    .tweets.1
    name: shimeji
    id: shimejitan
    tweets:
      1: shimejilove
      2: azupero
    
    예상 출력
    string "shimejilove"
    
  2. 예제 2

    입력
    .a
    a: sample case
    
    예상 출력
    string "sample case"
    
  3. 예제 3

    입력
    .my.obj
    my:
     str: string value
     obj:
        a: a
        b: b
        c: c
    
    예상 출력
    object
    
  4. 예제 4

    입력
    .str.inner
    str: inner
    
    예상 출력
    no such property
    
  5. 예제 5

    입력
    .no.such.property
    object:
        prop1: str
        prop2: str
    
    예상 출력
    no such property