🌞Algorithm/πŸ”₯programmers

[programmers] νŠœν”Œ -2019 카카였 개발자 겨울 인턴십

λΏŒμ•Ό._. 2021. 9. 4. 20:26

μ½”λ”© ν…ŒμŠ€νŠΈ μ—°μŠ΅ - 2019 카카였 개발자 겨울 인턴십


<νŠœν”Œ>

문제 μ„€λͺ…

 

μ…€ 수 μžˆλŠ” μˆ˜λŸ‰μ˜ μˆœμ„œ μžˆλŠ” μ—΄κ±° λ˜λŠ” μ–΄λ–€ μˆœμ„œλ₯Ό λ”°λ₯΄λŠ” μš”μ†Œλ“€μ˜ λͺ¨μŒμ„ νŠœν”Œ(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 μ΄ν•˜μΈ 경우만 μž…λ ₯으둜 μ£Όμ–΄μ§‘λ‹ˆλ‹€.

 

 

문제 풀이

   - my solution

def solution(s):
    answer = []
    
    s=s[1:len(s)-1] # ν°λ”°μ˜΄ν‘œ 제거
    
    result=[]
    val=''
    for j in range(len(s)):
        i=s[j]
        if i=='{':
            temp=[]
        elif i.isdigit(): #숫자이면
            val+=i
        elif i==',' and len(val)!=0: #κ΄„ν˜Έ μ•ˆμ˜ μ‰Όν‘œμ΄λ©΄
            temp.append(val)
            val=''
        elif i=='}':
            if len(val)!=0: #λ§ˆμ§€λ§‰ μˆ«μžκ°€ λ‚¨μ•„μžˆμœΌλ©΄
                temp.append(val)
                val=''
            result.append(temp)
            
    result.sort(key=lambda x:len(x)) #길이 순으둜 μ •λ ¬
    
    # 반볡문_값이 answer에 μ—†μœΌλ©΄ μΆ”κ°€
    for i in result:
        for j in i: 
            if int(j) not in answer:
                answer.append(int(j))
    return answer

λ‹€ ν’€κ³  λ‹€μ‹œ μ½”λ“œλ₯Ό λ³΄λ‹ˆ 쑰금 λ³΅μž‘ν•˜κ²Œ ν‘Ό 것 κ°™λ‹€..

 

1) μ›μ†Œ λ§ˆλ‹€ 뢄리해주기 μœ„ν•΄ 큰 λ”°μ˜΄ν‘œλ‘œ λ‘˜λŸ¬μ‹ΈμΈ 것은 제거

2) λ°˜λ³΅λ¬Έμ„ 돌며 { }와 , λ₯Ό μ‚¬μš©ν•˜μ—¬ 각 μ›μ†Œλ₯Ό ꡬ뢄

3) 길이 순으둜 μ •λ ¬

4) 길이 순으둜 μ •λ ¬ν•œ 것을 λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜μ—¬ answer λ°°μ—΄κ³Ό λΉ„κ΅ν•˜μ—¬ μ—†λŠ” κ°’λ§Œ μΆ”κ°€


μƒκ°πŸ€”

 

μ²˜μŒμ— 문제λ₯Ό 보며 생각해낸 것은 if문을 μ‚¬μš©ν•˜μ—¬ ν•˜λ‚˜ν•˜λ‚˜ νŒλ³„ν•΄μ£ΌλŠ” 것이닀.

더 짧고 κ°„κ²°ν•˜κ²Œ ν’€ 수 μžˆμ„ 것 같은데 아직 생각은 λ‚˜μ§€ μ•ŠλŠ”λ‹€ πŸ˜₯

 

λ‚΄κ°€ μƒκ°ν•˜κΈ°μ— 이 문제의 ν¬μΈνŠΈλŠ”

1) split ν•˜λŠ” 방법

2) μ›μ†Œμ˜ 유무 νŒλ³„

인 것 κ°™λ‹€. 


좜처: ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ μ½”λ”© ν…ŒμŠ€νŠΈ μ—°μŠ΅, https://programmers.co.kr/learn/challenges