[Python] S2_10799_μ‡ λ§‰λŒ€κΈ°πŸ”§

Sangho HanΒ·2023λ…„ 5μ›” 23일
post-thumbnail

https://www.acmicpc.net/problem/10799

문제

μ—¬λŸ¬ 개의 μ‡ λ§‰λŒ€κΈ°λ₯Ό λ ˆμ΄μ €λ‘œ μ ˆλ‹¨ν•˜λ €κ³  ν•œλ‹€. 효율적인 μž‘μ—…μ„ μœ„ν•΄μ„œ μ‡ λ§‰λŒ€κΈ°λ₯Ό μ•„λž˜μ—μ„œ μœ„λ‘œ 겹쳐 놓고, λ ˆμ΄μ €λ₯Ό μœ„μ—μ„œ 수직으둜 λ°œμ‚¬ν•˜μ—¬ μ‡ λ§‰λŒ€κΈ°λ“€μ„ 자λ₯Έλ‹€. μ‡ λ§‰λŒ€κΈ°μ™€ λ ˆμ΄μ €μ˜ λ°°μΉ˜λŠ” λ‹€μŒ 쑰건을 λ§Œμ‘±ν•œλ‹€.

  • μ‡ λ§‰λŒ€κΈ°λŠ” μžμ‹ λ³΄λ‹€ κΈ΄ μ‡ λ§‰λŒ€κΈ° μœ„μ—λ§Œ 놓일 수 μžˆλ‹€.
  • μ‡ λ§‰λŒ€κΈ°λ₯Ό λ‹€λ₯Έ μ‡ λ§‰λŒ€κΈ° μœ„μ— λ†“λŠ” 경우 μ™„μ „νžˆ ν¬ν•¨λ˜λ„λ‘ λ†“λ˜, 끝점은 κ²ΉμΉ˜μ§€ μ•Šλ„λ‘ λ†“λŠ”λ‹€.
  • 각 μ‡ λ§‰λŒ€κΈ°λ₯Ό 자λ₯΄λŠ” λ ˆμ΄μ €λŠ” 적어도 ν•˜λ‚˜ μ‘΄μž¬ν•œλ‹€.
  • λ ˆμ΄μ €λŠ” μ–΄λ–€ μ‡ λ§‰λŒ€κΈ°μ˜ μ–‘ 끝점과도 κ²ΉμΉ˜μ§€ μ•ŠλŠ”λ‹€.

μ•„λž˜ 그림은 μœ„ 쑰건을 λ§Œμ‘±ν•˜λŠ” 예λ₯Ό 보여쀀닀. μˆ˜ν‰μœΌλ‘œ κ·Έλ €μ§„ ꡡ은 싀선은 μ‡ λ§‰λŒ€κΈ°μ΄κ³ , 점은 λ ˆμ΄μ €μ˜ μœ„μΉ˜, 수직으둜 κ·Έλ €μ§„ 점선 ν™”μ‚΄ν‘œλŠ” λ ˆμ΄μ €μ˜ λ°œμ‚¬ λ°©ν–₯이닀.

μ΄λŸ¬ν•œ λ ˆμ΄μ €μ™€ μ‡ λ§‰λŒ€κΈ°μ˜ λ°°μΉ˜λŠ” λ‹€μŒκ³Ό 같이 κ΄„ν˜Έλ₯Ό μ΄μš©ν•˜μ—¬ μ™Όμͺ½λΆ€ν„° μˆœμ„œλŒ€λ‘œ ν‘œν˜„ν•  수 μžˆλ‹€.

  • λ ˆμ΄μ €λŠ” μ—¬λŠ” κ΄„ν˜Έμ™€ λ‹«λŠ” κ΄„ν˜Έμ˜ μΈμ ‘ν•œ 쌍 β€˜( ) ’ 으둜 ν‘œν˜„λœλ‹€. λ˜ν•œ, λͺ¨λ“  β€˜( ) β€™λŠ” λ°˜λ“œμ‹œ λ ˆμ΄μ €λ₯Ό ν‘œν˜„ν•œλ‹€.
  • μ‡ λ§‰λŒ€κΈ°μ˜ μ™Όμͺ½ 끝은 μ—¬λŠ” κ΄„ν˜Έ β€˜ ( ’ 둜, 였λ₯Έμͺ½ 끝은 λ‹«νžŒ κ΄„ν˜Έ β€˜) ’ 둜 ν‘œν˜„λœλ‹€.

μœ„ 예의 κ΄„ν˜Έ ν‘œν˜„μ€ κ·Έλ¦Ό μœ„μ— μ£Όμ–΄μ Έ μžˆλ‹€.

μ‡ λ§‰λŒ€κΈ°λŠ” λ ˆμ΄μ €μ— μ˜ν•΄ λͺ‡ 개의 쑰각으둜 μž˜λ €μ§€λŠ”λ°, μœ„ μ˜ˆμ—μ„œ κ°€μž₯ μœ„μ— μžˆλŠ” 두 개의 μ‡ λ§‰λŒ€κΈ°λŠ” 각각 3κ°œμ™€ 2개의 쑰각으둜 μž˜λ €μ§€κ³ , 이와 같은 λ°©μ‹μœΌλ‘œ μ£Όμ–΄μ§„ μ‡ λ§‰λŒ€κΈ°λ“€μ€ 총 17개의 쑰각으둜 μž˜λ €μ§„λ‹€.

μ‡ λ§‰λŒ€κΈ°μ™€ λ ˆμ΄μ €μ˜ 배치λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ΄„ν˜Έ ν‘œν˜„μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ, μž˜λ €μ§„ μ‡ λ§‰λŒ€κΈ° 쑰각의 총 개수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

ν•œ 쀄에 μ‡ λ§‰λŒ€κΈ°μ™€ λ ˆμ΄μ €μ˜ 배치λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ΄„ν˜Έ ν‘œν˜„μ΄ 곡백없이 μ£Όμ–΄μ§„λ‹€. κ΄„ν˜Έ 문자의 κ°œμˆ˜λŠ” μ΅œλŒ€ 100,000이닀.

좜λ ₯

μž˜λ €μ§„ 쑰각의 총 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜λ₯Ό ν•œ 쀄에 좜λ ₯ν•œλ‹€.

쑰건

  • μ‹œκ°„ μ œν•œ 1초
  • λ©”λͺ¨λ¦¬ μ œν•œ 256MB

μ ‘κ·Ό

  1. 일단 μŠ€νƒλ¬Έμ œλ‹ˆκΉŒ '('κ°€ λ‚˜μ˜€λ©΄ μŠ€νƒμ— λ„£μ–΄μ£Όμž.
  2. ')'κ°€ λ‚˜μ˜€λ©΄ λ ˆμ΄μ €λ₯Ό λ§Œλ“œλŠ” 경우 or λ§‰λŒ€κΈ° ν•˜λ‚˜κ°€ λλ‚˜λŠ” 경우둜 λ‚˜λˆ„μž.
  3. 근데 λ ˆμ΄μ € κ°œμˆ˜λŠ” μ–΄λ–»κ²Œ ν•΄μ€˜μ•Ό ν•˜μ§€..? 계속 쀑첩을 ν•΄μ•Όν•˜λŠ”κ±΄μ§€, μ–Έμ œ μ΄ˆκΈ°ν™”ν•˜λŠ” 건지 고민이 ν•„μš”ν•˜λ‹€.

πŸ”” μ²˜μŒμ—λŠ” λ§‰λŒ€κΈ°κ°€ λλ‚˜λ©΄ κ·Έ μ•ˆμ— ν¬ν•¨λœ λ ˆμ΄μ €μ˜ 개수 +1개λ₯Ό μΆ”κ°€ν•΄μ£ΌλŠ” μ‹μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν–ˆμ—ˆλ‹€.
ν•˜μ§€λ§Œ κ·Έλ ‡κ²Œ ν•˜λ‹ˆ λ ˆμ΄μ €μ˜ 개수λ₯Ό μ„€μ •ν•΄μ£ΌκΈ°κ°€ ꡉμž₯히 λ³΅μž‘ν•΄μ Έμ„œ ꡬ글링을 ν•΄λ³Έ κ²°κ³Ό λ ˆμ΄μ €κ°€ λ‚˜μ˜¬ λ•Œλ§ˆλ‹€ 잘린 λ§‰λŒ€κΈ°μ˜ 개수λ₯Ό μΆ”κ°€ν•΄μ£Όλ©΄ λœλ‹€λŠ” 방법을 찾게 λ˜μ—ˆλ‹€!

μ½”λ“œ

import sys
input = sys.stdin.readline

bar_razor = list(input().rstrip())
answer = 0
stk = []

for i in range(len(bar_razor)):
    if bar_razor[i] == '(':
        stk.append('(')

    else:
        if bar_razor[i-1] == '(': 
            stk.pop()
            answer += len(stk)

        else:
            stk.pop() 
            answer += 1 

print(answer)
  1. '('κ°€ λ‚˜μ˜€λ©΄ μŠ€νƒμ— λ„£μ–΄μ€€λ‹€.
  2. ')'κ°€ λ‚˜μ˜€λ©΄ 두 κ°€μ§€ 경우둜 λ‚˜λ‰œλ‹€.
  • 직전이 '('인 경우, λ ˆμ΄μ €κ°€ ν•˜λ‚˜ μƒμ„±λœ κ²ƒμ΄λ―€λ‘œ ν˜„μž¬ μŠ€νƒμ˜ 길이 (= ν˜„μž¬ λ§‰λŒ€κΈ°μ˜ 개수) λ§ŒνΌμ„ answer에 더해쀀닀.
  • 직전이 ')'인 경우, λ§‰λŒ€κΈ° ν•˜λ‚˜κ°€ λλ‚˜ λ„νŠΈλ¨Έλ¦¬κ°€ 1개 λ‚¨κ²Œ λ˜λ―€λ‘œ answer에 1을 더해쀀닀.

λŠλ‚€ 점 & 배운 점

  1. 생각보닀 μ½”λ“œ μžμ²΄λŠ” μ‰¬μš΄ λ¬Έμ œμ˜€λ‹€. λ‹€λ§Œ 잘린 λ§‰λŒ€κΈ°λ₯Ό μ–Έμ œ μΆ”κ°€ν•΄μ£Όμ–΄μ•Όν•˜λŠ”μ§€ μƒκ°ν•˜λŠ” 데 였래 κ±Έλ Έλ‹€.
  2. 이런 μ‹μœΌλ‘œ κ΄„ν˜Έλ₯Ό μ΄μš©ν•œ μŠ€νƒ λ¬Έμ œκ°€ κ½€λ‚˜ λ§Žμ€ 것 κ°™λ‹€. 풀이 μžμ²΄λŠ” λΉ„μŠ·ν•˜λ‹ˆ 잘 ν•™μŠ΅ν•΄λ‘μž!
profile
λΈ”λ‘œκ·Έ μ΄κ΄€ν•˜μ˜€μŠ΅λ‹ˆλ‹€ (https://bbang.dev/)

0개의 λŒ“κΈ€