괄호 문자열 편집기

면접 대비

시간 제한3초메모리 제한2048 MB

요약
커서로 조작하는 괄호 문자열 편집기에서 텍스트가 올바른 괄호 문자열이 되는 순간마다 동작 번호를 XOR해 최종 값을 구한다.
난이도

보통10점 중 7점

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

문제

올바른 괄호 문자열은 다음과 같이 정의됩니다.

  • 빈 문자열 ∅\varnothing은 올바른 괄호 문자열입니다.
  • AA가 올바른 괄호 문자열이라면, AA를 괄호로 둘러싼 (A)(A) 또한 올바른 괄호 문자열입니다.
  • AA와 BB가 올바른 괄호 문자열이라면, AA와 BB를 붙인 ABAB 또한 올바른 괄호 문자열입니다.

여러분은 이 문제에서 텍스트 편집기를 관리하면서 현재 편집기의 텍스트가 올바른 괄호 문자열인지의 여부를 실시간으로 판정해야 합니다. 구현해야 하는 텍스트 편집기는 다음과 같은 명세를 따릅니다.

초기에 편집기의 텍스트는 빈 문자열 ∅\varnothing입니다. 이 편집기에는 하나의 커서가 있습니다. 편집기의 텍스트가 SS이고 커서의 위치가 jj일 때, 편집기가 지원해야 하는 동작은 아래와 같이 정의됩니다.

  • (: SS의 jj번째 문자와 j+1j+1번째 문자 사이에 문자 (를 삽입하고 커서의 위치를 11만큼 뒤로 옮깁니다. j=0j=0인 경우 문자열의 맨 앞에, j=∣S∣j=|S|인 경우 끝에 문자를 삽입합니다.
  • ): SS의 jj번째 문자와 j+1j+1번째 문자 사이에 문자 )를 삽입하고 커서의 위치를 11만큼 뒤로 옮깁니다. j=0j=0인 경우 문자열의 맨 앞에, j=∣S∣j=|S|인 경우 끝에 문자를 삽입합니다.
  • <: 커서의 위치를 11만큼 앞으로 옮깁니다. 단, j=0j=0인 경우 커서는 움직이지 않습니다.
  • >: 커서의 위치를 11만큼 뒤로 옮깁니다. 단, j=∣S∣j=|S|인 경우 커서는 움직이지 않습니다.
  • X: SS의 jj번째 문자를 삭제하고 커서의 위치를 11만큼 앞으로 옮깁니다. j=0j=0인 경우에는 아무것도 하지 않습니다.

편집기가 지원하는 동작의 정의에 의해 매 순간 0≤j≤∣S∣0 \le j \le |S|가 성립하며, 초기에 jj의 값은 00입니다.

각 동작이 시행된 후에 여러분은 편집기의 텍스트 SS가 올바른 괄호 문자열인지 기록해야 합니다. 편집기에는 이를 위한 변수 CC가 있으며, 초기에 그 값은 00입니다.

각 동작이 시행된 후 여러분은 CC를 다음과 같이 변경해야 합니다.

  • ii번째 동작을 수행한 후 SS가 올바른 괄호 문자열이라면 CC의 값을 C⊕iC \oplus i으로 변경합니다.†^\dagger

여러분은 명세에 따라 편집기를 구현한 뒤, QQ개의 동작을 수행하여 마지막에 얻은 CC의 값을 출력하는 프로그램을 작성해야 합니다.

†^\dagger 두 정수 xx와 yy가 주어질 때 x⊕yx \oplus y는 두 정수의 비트 XOR을 의미하며, 대부분 프로그래밍 언어에서 (x ^ y)와 같이 사용할 수 있습니다.

입력

첫 번째 줄에 수행해야 하는 동작의 수 QQ가 주어집니다. (1≤Q≤10,000,0001 \le Q \le 10\\, 000\\, 000)

두 번째 줄에 수행해야 하는 동작을 모두 순서대로 늘어놓은 길이 QQ의 문자열 PP가 주어집니다.

출력

QQ개의 동작을 모두 수행한 뒤 마지막에 얻은 CC의 값을 한 줄에 출력합니다.

힌트

예제 입출력에서 각 동작을 수행한 후 텍스트와 커서, 변수 CC의 상태는 아래와 같습니다.

동작의 종류편집기의 텍스트커서의 위치올바른 괄호 문자열?CC
)")"11아니오00
<")"00아니오00
("()"11네33
<"()"00네77
("(()"11아니오77
)"()()"22네11
X"(()"11아니오11
("((()"22아니오11
)"(()()"33아니오11
)"(())()"44네1111

예제1

  1. 예제 1

    입력
    10
    )<(<()X())
    
    예상 출력
    11