🐍 μ½”λ”©ν…ŒμŠ€νŠΈ λŒ€λΉ„ : PS

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] νŠœν”Œ (level2, python)

개발자 HOON 2022. 9. 9. 23:39

문제 μ„€λͺ…

 

μ…€μˆ˜μžˆλŠ” μˆ˜λŸ‰μ˜ μˆœμ„œμžˆλŠ” μ—΄κ±° λ˜λŠ” μ–΄λ–€ μˆœμ„œλ₯Ό λ”°λ₯΄λŠ” μš”μ†Œλ“€μ˜ λͺ¨μŒμ„ νŠœν”Œ(tuple)이라고 ν•©λ‹ˆλ‹€. n개의 μš”μ†Œλ₯Ό 가진 νŠœν”Œμ„ n-νŠœν”Œ(n-tuple)이라고 ν•˜λ©°, λ‹€μŒκ³Ό 같이 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

  • (a1, a2, a3, ..., an)

 

νŠœν”Œμ€ λ‹€μŒκ³Ό 같은 μ„±μ§ˆμ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€.

 

  1. μ€‘λ³΅λœ μ›μ†Œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. ex : (2, 3, 1, 2)
  2. μ›μ†Œμ— 정해진 μˆœμ„œκ°€ 있으며, μ›μ†Œμ˜ μˆœμ„œκ°€ λ‹€λ₯΄λ©΄ μ„œλ‘œ λ‹€λ₯Έ νŠœν”Œμž…λ‹ˆλ‹€. ex : (1, 2, 3) ≠ (1, 3, 2)
  3. νŠœν”Œμ˜ μ›μ†Œ κ°œμˆ˜λŠ” μœ ν•œν•©λ‹ˆλ‹€.

 

μ›μ†Œμ˜ κ°œμˆ˜κ°€ n개이고, μ€‘λ³΅λ˜λŠ” μ›μ†Œκ°€ μ—†λŠ” νŠœν”Œ (a1, a2, a3, ..., an)이 μ£Όμ–΄μ§ˆ λ•Œ(단, a1, a2, ..., an은 μžμ—°μˆ˜), μ΄λŠ” λ‹€μŒκ³Ό 같이 집합 기호 '{', '}'λ₯Ό μ΄μš©ν•΄ ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

  • {{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4, ..., an}}

 

예λ₯Ό λ“€μ–΄ νŠœν”Œμ΄ (2, 1, 3, 4)인 경우 μ΄λŠ”

 

  • {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}

 

와 같이 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ, 집합은 μ›μ†Œμ˜ μˆœμ„œκ°€ λ°”λ€Œμ–΄λ„ μƒκ΄€μ—†μœΌλ―€λ‘œ

 

  • {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}
  • {{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}}
  • {{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}}

 

λŠ” λͺ¨λ‘ 같은 νŠœν”Œ (2, 1, 3, 4)λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

 

νŠΉμ • νŠœν”Œμ„ ν‘œν˜„ν•˜λŠ” 집합이 λ‹΄κΈ΄ λ¬Έμžμ—΄ sκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, sκ°€ ν‘œν˜„ν•˜λŠ” νŠœν”Œμ„ 배열에 λ‹΄μ•„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.


[μ œν•œμ‚¬ν•­]

 

  • s의 κΈΈμ΄λŠ” 5 이상 1,000,000 μ΄ν•˜μž…λ‹ˆλ‹€.
  • sλŠ” μˆ«μžμ™€ '{', '}', ',' 둜만 이루어져 μžˆμŠ΅λ‹ˆλ‹€.
  • μˆ«μžκ°€ 0으둜 μ‹œμž‘ν•˜λŠ” κ²½μš°λŠ” μ—†μŠ΅λ‹ˆλ‹€.
  • sλŠ” 항상 μ€‘λ³΅λ˜λŠ” μ›μ†Œκ°€ μ—†λŠ” νŠœν”Œμ„ μ˜¬λ°”λ₯΄κ²Œ ν‘œν˜„ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
  • sκ°€ ν‘œν˜„ν•˜λŠ” νŠœν”Œμ˜ μ›μ†ŒλŠ” 1 이상 100,000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • return ν•˜λŠ” λ°°μ—΄μ˜ 길이가 1 이상 500 μ΄ν•˜μΈ 경우만 μž…λ ₯으둜 μ£Όμ–΄μ§‘λ‹ˆλ‹€.

 


 

[μž…μΆœλ ₯ 예]


 

풀이 μ½”λ“œ

def solution(s):
    s = '[' + s[1:-1] + ']'
    a = eval(s)
    a.sort(key=len)
    
    if len(a) == 1:
        return [a[0].pop()]
    
    answer = []
    
    for i in range(len(a)):
        if i == 0:
            tmp_set = a[0] - set()
        else:
            tmp_set = a[i] - a[i-1]
        answer.append(tmp_set.pop())
        
    return answer

λ¬Έμžμ—΄ μ²˜λ¦¬μ™€ 집합을 μ΄μš©ν•΄ 문제λ₯Ό ν•΄κ²°ν–ˆλ‹€.

λ¬Έμžμ—΄ sλ₯Ό 집합이 λ‹΄κΈ΄ 리슀트λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄λ‘œ λ³€κ²½ν•˜κ³ , eval ν•¨μˆ˜λ‘œ ν•΄λ‹Ή 객체λ₯Ό a둜 μƒμ„±ν–ˆλ‹€.

κ·Έ λ‹€μŒ 길이 순으둜 μ •λ ¬μ‹œμΌ°λ‹€.

 

리슀트 λ‚΄λΆ€λ₯Ό 돌며, 차집합을 μ΄μš©ν•΄ 이전 집합에 μ—†λ˜ μƒˆλ‘œμš΄ μ›μ†Œλ₯Ό answer λ¦¬μŠ€νŠΈμ— μΆ”κ°€ν•œλ‹€.

예λ₯Ό λ“€μ–΄, 이전 집합이 {2}, 이번 집합이 {3, 2} 이라면, 3이 μƒˆλ‘œμ΄ μƒκ²ΌμœΌλ―€λ‘œ answer에 3을 μΆ”κ°€ν–ˆλ‹€.

 

+ μΆ”κ°€μ μœΌλ‘œ 쒋은 아이디어

결둠적으둜 문제의 νŠΉμ„± 상, a1은 λͺ¨λ“  집합에 ν¬ν•¨λ˜μ–΄ μžˆμœΌλ‹ˆ κ°€μž₯ 많이 μΆœν˜„ν–ˆμ„ 것이고, an은 집합 ν•˜λ‚˜μ—λ§Œ ν¬ν•¨λ˜μ–΄ μžˆμœΌλ‹ˆ κ°€μž₯ 적게 μΆœν˜„ν–ˆμ„ 것이닀.

λ”°λΌμ„œ λ¬Έμžμ—΄μ—μ„œ 숫자만 뽑아 Counter둜 숫자λ₯Ό μ„Ό ν›„, counting이 λ§Žμ€ 순으둜 μ •λ ¬ν•΄ κ²°κ³Όλ₯Ό μ–»λŠ” 방법이 μžˆλ‹€.