AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。
出典:
AtCoder Beginner Contest 064 D – Insertion
公式解説とは後半が少し違うけど、ちゃんと動く。両端から同じ流れでスキャンするのが好きなので……。
# AtCoder Beginner Contest D - Insertion
# https://atcoder.jp/contests/abc064/tasks/abc064_d
# tag: 文字列 括弧列 考察
# 与えられた文字列に対して、'(' を左端に、')' を右端に
# 適切な数追加することで、あらゆる括弧列を正しいものに
# できる。
# '(' をいくつ追加するかについて考えると、
# 左端から見ていった際に、')' が '(' より最大に過剰に
# なっている分だけ追加してやる必要がある。
# f.e.
# S = ')))())((' の場合
# ) ) ) ( ) ) ( (
# 1 2 3 2 3 4 3 2
# 最大 4 個の ')' が '(' より多くなっているので、
# 左端に '(' を 4 個追加しなければならない。
# 今度は右から数えてみる
# ) ) ) ( ) ) ( (
# -2 -1 0 1 0 1 2 1
# 最大 2 個の '(' が ')' より多くなっているので、
# 右端に ')' を 2 個追加しなければならない。
# 以上より、完成形は
# "((((" + ")))())((" + "))"
def main():
N = int(input())
S = input()
# 左端から文字列を見ていき、')' が最大に
# 過剰になっている個数を確認する。
tmp = [0]
for c in S:
if c == '(':
tmp.append(tmp[-1] - 1)
else:
tmp.append(tmp[-1] + 1)
# その過剰分の '(' を左端に追加(最後に行う)
left = max(tmp)
# 右端から同様に '(' が最大に過剰に
# なっている個数を確認する。
tmp = [0]
for c in S[::-1]:
if c == ')':
tmp.append(tmp[-1] - 1)
else:
tmp.append(tmp[-1] + 1)
# その過剰分の ')' を(略
right = max(tmp)
print('(' * left + S + ')' * right)
main()
関連