[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€/python] 2020 카카였 인턴십 : μˆ˜μ‹ μ΅œλŒ€ν™”

2021. 9. 10. 16:06

문제 μ„€λͺ…

IT 벀처 νšŒμ‚¬λ₯Ό μš΄μ˜ν•˜κ³  μžˆλŠ” λΌμ΄μ–Έμ€ 맀년 사내 해컀톀 λŒ€νšŒλ₯Ό κ°œμ΅œν•˜μ—¬ μš°μŠΉμžμ—κ²Œ μƒκΈˆμ„ μ§€κΈ‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
이번 λŒ€νšŒμ—μ„œλŠ” μš°μŠΉμžμ—κ²Œ μ§€κΈ‰λ˜λŠ” μƒκΈˆμ„ 이전 λŒ€νšŒμ™€λŠ” λ‹€λ₯΄κ²Œ λ‹€μŒκ³Ό 같은 λ°©μ‹μœΌλ‘œ κ²°μ •ν•˜λ €κ³  ν•©λ‹ˆλ‹€.
해컀톀 λŒ€νšŒμ— μ°Έκ°€ν•˜λŠ” λͺ¨λ“  μ°Έκ°€μžλ“€μ—κ²ŒλŠ” μˆ«μžλ“€κ³Ό 3κ°€μ§€μ˜ μ—°μ‚°λ¬Έμž(+, -, *) 만으둜 이루어진 μ—°μ‚° μˆ˜μ‹μ΄ μ „λ‹¬λ˜λ©°, μ°Έκ°€μžμ˜ λ―Έμ…˜μ€ 전달받은 μˆ˜μ‹μ— ν¬ν•¨λœ μ—°μ‚°μžμ˜ μš°μ„ μˆœμœ„λ₯Ό 자유둭게 μž¬μ •μ˜ν•˜μ—¬ λ§Œλ“€ 수 μžˆλŠ” κ°€μž₯ 큰 숫자λ₯Ό μ œμΆœν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
단, μ—°μ‚°μžμ˜ μš°μ„ μˆœμœ„λ₯Ό μƒˆλ‘œ μ •μ˜ν•  λ•Œ, 같은 μˆœμœ„μ˜ μ—°μ‚°μžλŠ” μ—†μ–΄μ•Ό ν•©λ‹ˆλ‹€. 즉, + > - > * λ˜λŠ” - > * > + λ“±κ³Ό 같이 μ—°μ‚°μž μš°μ„ μˆœμœ„λ₯Ό μ •μ˜ν•  수 μžˆμœΌλ‚˜ +,* > - λ˜λŠ” * > +,-처럼 2개 μ΄μƒμ˜ μ—°μ‚°μžκ°€ λ™μΌν•œ μˆœμœ„λ₯Ό 가지도둝 μ—°μ‚°μž μš°μ„ μˆœμœ„λ₯Ό μ •μ˜ν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€. μˆ˜μ‹μ— ν¬ν•¨λœ μ—°μ‚°μžκ°€ 2개라면 μ •μ˜ν•  수 μžˆλŠ” μ—°μ‚°μž μš°μ„ μˆœμœ„ 쑰합은 2! = 2가지이며, μ—°μ‚°μžκ°€ 3개라면 3! = 6가지 쑰합이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
λ§Œμ•½ κ³„μ‚°λœ κ²°κ³Όκ°€ 음수라면 ν•΄λ‹Ή 숫자의 μ ˆλŒ“κ°’μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ μ œμΆœν•˜λ©° μ œμΆœν•œ μˆ«μžκ°€ κ°€μž₯ 큰 μ°Έκ°€μžλ₯Ό 우승자둜 μ„ μ •ν•˜λ©°, μš°μŠΉμžκ°€ μ œμΆœν•œ 숫자λ₯Ό μš°μŠΉμƒκΈˆμœΌλ‘œ μ§€κΈ‰ν•˜κ²Œ λ©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, μ°Έκ°€μž 쀑 λ„€μ˜€κ°€ μ•„λž˜μ™€ 같은 μˆ˜μ‹μ„ μ „λ‹¬λ°›μ•˜λ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.

"100-200*300-500+20"

일반적으둜 μˆ˜ν•™ 및 μ „μ‚°ν•™μ—μ„œ μ•½μ†λœ μ—°μ‚°μž μš°μ„ μˆœμœ„μ— λ”°λ₯΄λ©΄ λ”ν•˜κΈ°μ™€ λΉΌκΈ°λŠ” μ„œλ‘œ λ™λ“±ν•˜λ©° κ³±ν•˜κΈ°λŠ” λ”ν•˜κΈ°, 빼기에 λΉ„ν•΄ μš°μ„ μˆœμœ„κ°€ λ†’μ•„ * > +,- λ‘œ μš°μ„ μˆœμœ„κ°€ μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
λŒ€νšŒ κ·œμΉ™μ— 따라 + > - > * λ˜λŠ” - > * > + λ“±κ³Ό 같이 μ—°μ‚°μž μš°μ„ μˆœμœ„λ₯Ό μ •μ˜ν•  수 μžˆμœΌλ‚˜ +,* > - λ˜λŠ” * > +,- μ²˜λŸΌ 2개 μ΄μƒμ˜ μ—°μ‚°μžκ°€ λ™μΌν•œ μˆœμœ„λ₯Ό 가지도둝 μ—°μ‚°μž μš°μ„ μˆœμœ„λ₯Ό μ •μ˜ν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.
μˆ˜μ‹μ— μ—°μ‚°μžκ°€ 3개 μ£Όμ–΄μ‘ŒμœΌλ―€λ‘œ κ°€λŠ₯ν•œ μ—°μ‚°μž μš°μ„ μˆœμœ„ 쑰합은 3! = 6가지이며, κ·Έ 쀑 + > - > * λ‘œ μ—°μ‚°μž μš°μ„ μˆœμœ„λ₯Ό μ •ν•œλ‹€λ©΄ 결괏값은 22,000원이 λ©λ‹ˆλ‹€.
λ°˜λ©΄μ— * > + > - λ‘œ μ—°μ‚°μž μš°μ„ μˆœμœ„λ₯Ό μ •ν•œλ‹€λ©΄ μˆ˜μ‹μ˜ 결괏값은 -60,420 μ΄μ§€λ§Œ, κ·œμΉ™μ— 따라 우승 μ‹œ μƒκΈˆμ€ μ ˆλŒ“κ°’μΈ 60,420원이 λ©λ‹ˆλ‹€.

μ°Έκ°€μžμ—κ²Œ 주어진 μ—°μ‚° μˆ˜μ‹μ΄ λ‹΄κΈ΄ λ¬Έμžμ—΄ expression이 λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, 우승 μ‹œ 받을 수 μžˆλŠ” κ°€μž₯ 큰 μƒκΈˆ κΈˆμ•‘μ„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

 

μ œν•œ 사항

  • expression은 길이가 3 이상 100 μ΄ν•˜μΈ λ¬Έμžμ—΄μž…λ‹ˆλ‹€.
  • expression은 곡백문자, κ΄„ν˜Έλ¬Έμž 없이 μ˜€λ‘œμ§€ μˆ«μžμ™€ 3κ°€μ§€μ˜ μ—°μ‚°μž(+, -, *) 만으둜 이루어진 μ˜¬λ°”λ₯Έ μ€‘μœ„ν‘œκΈ°λ²•(μ—°μ‚°μ˜ 두 λŒ€μƒ 사이에 μ—°μ‚°κΈ°ν˜Έλ₯Ό μ‚¬μš©ν•˜λŠ” 방식)으둜 ν‘œν˜„λœ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. 잘λͺ»λœ 연산식은 μž…λ ₯으둜 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€.
    • 즉, "402+-561*"처럼 잘λͺ»λœ μˆ˜μ‹μ€ μ˜¬λ°”λ₯Έ μ€‘μœ„ν‘œκΈ°λ²•μ΄ μ•„λ‹ˆλ―€λ‘œ 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€.
  • expression의 ν”Όμ—°μ‚°μž(operand)λŠ” 0 이상 999 μ΄ν•˜μ˜ μˆ«μžμž…λ‹ˆλ‹€.
    • 즉, "100-2145*458+12"처럼 999λ₯Ό μ΄ˆκ³Όν•˜λŠ” ν”Όμ—°μ‚°μžκ°€ ν¬ν•¨λœ μˆ˜μ‹μ€ μž…λ ₯으둜 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€.
    • "-56+100"처럼 ν”Όμ—°μ‚°μžκ°€ 음수인 μˆ˜μ‹λ„ μž…λ ₯으둜 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€.
  • expression은 적어도 1개 μ΄μƒμ˜ μ—°μ‚°μžλ₯Ό ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
  • μ—°μ‚°μž μš°μ„ μˆœμœ„λ₯Ό μ–΄λ–»κ²Œ μ μš©ν•˜λ”λΌλ„, expression의 쀑간 계산값과 μ΅œμ’… 결괏값은 μ ˆλŒ“κ°’μ΄ 263 - 1 μ΄ν•˜κ°€ λ˜λ„λ‘ μž…λ ₯이 μ£Όμ–΄μ§‘λ‹ˆλ‹€.
  • 같은 μ—°μ‚°μžλΌλ¦¬λŠ” μ•žμ— μžˆλŠ” κ²ƒμ˜ μš°μ„ μˆœμœ„κ°€ 더 λ†’μŠ΅λ‹ˆλ‹€.

 

μ •λ‹΅

from itertools import permutations

def solution(expression):
    answer = 0
    expression = expression.replace("-", " - ").replace("+", " + ").replace("*", " * ").split()
    operator = [i for i in ['*', '+', '-'] if i in expression]
    
    for op in permutations(operator, len(operator)):
        calcul = expression.copy()
        for o in op:
            while o in calcul:
                i = calcul.index(o)
                calcul = calcul[:i-1] + [str(eval(''.join(calcul[i-1:i+2])))] + calcul[i+2:]
        answer = max(answer, (abs(int(calcul[0]))))

    return answer

expression의 값을 " "λ₯Ό κΈ°μ€€μœΌλ‘œ split ν•˜κΈ° μœ„ν•΄ expression의 μ—°μ‚°μžλ₯Ό μ•žλ’€ 띄어쓰기λ₯Ό λ„£μ–΄ replaceν•œλ‹€.

operatorμ—λŠ” expression에 μ‚¬μš©λœ μ—°μ‚°μžλ₯Ό λ„£μ–΄μ€€λ‹€.

 

permutationsλ₯Ό μ΄μš©ν•˜μ—¬ μ—°μ‚°μžμ˜ μˆœμ—΄μ„ κ΅¬ν•˜κ³ 

expression을 copyν•œ calcul을 μˆ˜μ •ν•˜λ©΄μ„œ κ³„μ‚°ν•œλ‹€.

μš°μ„ μˆœμœ„ 첫 λ²ˆμ§Έκ°€ *일 경우λ₯Ό 예λ₯Ό λ“€λ©΄,

calculμ—μ„œ *의 μœ„μΉ˜λ₯Ό μ°Ύμ•„ i에 μ €μž₯ν•˜λ©΄ i-1은 μ•ž 숫자, i+1은 λ’· μˆ«μžκ°€ 될 것이닀.

calcul의 인덱슀 i-1λΆ€ν„° i+1κΉŒμ§€μ˜ 값을 joinν•˜μ—¬ eval ν•¨μˆ˜λ₯Ό 톡해 계산 ν›„ 

계산에 쓰인 3개의 κ°’ μžλ¦¬μ— λ„£μ–΄ 이어뢙인닀.

 

 

πŸ’₯ calcul = expression의 ν˜•νƒœλ‘œ λ³΅μ‚¬ν•˜λ©΄ calcul을 μˆ˜μ •ν•  λ•Œ expression도 ν•¨κ»˜ λ°”λ€Œλ―€λ‘œ copyν•΄μ•Όν•œλ‹€.

πŸ’₯ eval은 λ¬Έμžμ—΄ ν˜•νƒœμ˜ μˆ˜μ‹μ„ κ³„μ‚°ν•΄μ£ΌλŠ” ν•¨μˆ˜μ΄λ‹€.

 

μœ„ 과정을 λ°˜λ³΅ν•˜λ©΄μ„œ λͺ¨λ“  μ—°μ‚°μžλ₯Ό κ³„μ‚°ν–ˆμ„ λ•Œ calculμ—λŠ” 숫자 ν•˜λ‚˜λ§Œ λ‚¨μ•„μžˆμœΌλ―€λ‘œ calcul[0]κ³Ό answer을 λΉ„κ΅ν•˜μ—¬ μ΅œλŒ€κ°’μ„ answer에 κ°±μ‹ ν•œλ‹€.

 

permutations의 μžμ„Έν•œ μ„€λͺ…은 μ•„λž˜μ˜ ν¬μŠ€νŒ…μ„ μ°Έκ³ ν•˜λ©΄ λœλ‹€.

2021.04.01 - [πŸ”μ•Œκ³ λ¦¬μ¦˜/πŸ”…κ°œλ…μ •λ¦¬] - [파이썬/python] μˆœμ—΄κ³Ό μ‘°ν•© : itertools μ΄μš©ν•˜κΈ° (permutations, combinations)

 

[파이썬/python] μˆœμ—΄κ³Ό μ‘°ν•© : itertools μ΄μš©ν•˜κΈ° (permutations, combinations)

itertoolsλ₯Ό μ΄μš©ν•˜μ—¬ μˆœμ—΄κ³Ό 쑰합을 κ΅¬ν˜„ν•˜λ©΄ λ”μš± λΉ λ₯΄κ²Œ μ²˜λ¦¬ν•  수 μžˆλ‹€. 1. μˆœμ—΄ : permutations(N, r) Nμ—μ„œ 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•Šκ³ , r개λ₯Ό 뽑아 μˆœμ„œλŒ€λ‘œ λ‚˜μ—΄ν•œλ‹€. 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, 뽑

ye333.tistory.com

 

728x90

BELATED ARTICLES

more