πŸ“– Problem Solution/Programmers

2020 카카였 인턴쉽 μˆ˜μ‹ μ΅œλŒ€ν™” Swift

Fomagran πŸ’» 2020. 9. 3. 17:37
728x90
λ°˜μ‘ν˜•

문제 μ„€λͺ…

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 μ΄ν•˜κ°€ λ˜λ„λ‘ μž…λ ₯이 μ£Όμ–΄μ§‘λ‹ˆλ‹€.
  • 같은 μ—°μ‚°μžλΌλ¦¬λŠ” μ•žμ— μžˆλŠ” κ²ƒμ˜ μš°μ„ μˆœμœ„κ°€ 더 λ†’μŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

expression result
"50*6-3*2" 300
"100-200*300-500+20" 60420

Foma의 풀이

 

1. μ—°μ‚°μžμ˜ 갯수λ₯Ό μ•Œμ•„λ‚΄μ–΄ μš°μ„ μˆœμœ„μ‘°ν•©μ„ λ§Œλ“€μ–΄λ‚Όμˆ˜ μžˆλŠλƒ

 

2 .식에 ν¬ν•¨λœ μˆ«μžμ™€ μ—°μ‚°μžλ₯Ό 각각 뢄리해낼 수 μžˆλŠλƒ

 

3. μš°μ„ μˆœμœ„μ‘°ν•©λŒ€λ‘œ 각 μ‹μ˜ μ—°μ‚°μžμ˜ μœ„μΉ˜λ₯Ό μ•Œμ•„λ‚΄μ–΄ μœ„μΉ˜μ— λ§žλŠ” μˆ«μžλ“€μ„ μ—°μ‚°ν•˜κ³  식을 μž¬μ •λ¦½ν• μˆ˜ μžˆλŠ”κ°€

 

4. μš°μ„ μˆœμœ„μ‘°ν•©λŒ€λ‘œ μ—°μ‚°ν•œ μ‹μ˜ μ ˆλŒ€κ°’ 쀑 κ°€μž₯ μ΅œλŒ€κ°’μ„ λ°˜ν™˜ν• μˆ˜ μžˆλŠ”κ°€

 

μ œκ°€ μƒκ°ν•œ 핡심은 μ΄λ ‡κ²Œ 4κ°€μ§€μž…λ‹ˆλ‹€.

 

μžμ„Έν•œ ν’€μ΄λŠ” μ•„λž˜μ— μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

 

expressionμ—μ„œ 각 μ—°μ‚°μžμ˜ μœ„μΉ˜λ₯Ό 담아쀄 배열듀을 λ§Œλ“€μ–΄μ€€λ‹€. => var minus = [Int]() var multiple = [Int]() var plus = [Int]()

 

λ°”λ€” 식을 담을 배열을 λ§Œλ“€μ–΄μ€€λ‹€. => var numbers = [String]()

 

while문에 ν•„μš”ν•œ 숫자λ₯Ό μ €μž₯ν•  λ³€μˆ˜λ₯Ό λ§Œλ“€μ–΄μ€€λ‹€. => var j = Int()

 

(λ‹€λ₯Έ ν•¨μˆ˜κ°€ 있기 λ•Œλ¬Έμ— λ°˜λ“œμ‹œ μœ„μ˜ λ³€μˆ˜λ“€μ€ solutionν•¨μˆ˜ 밖에닀가 λ§Œλ“€μ–΄μ€€λ‹€.)

 

그리고 μ—°μ‚°μžμ˜ μš°μ„ μˆœμœ„ 쑰합듀을 담을 2차원 배열을 λ§Œλ“€μ–΄μ€€λ‹€. => var order = [[String]]()

 

μš°μ„ μˆœμœ„μ‘°ν•©λŒ€λ‘œ μ—°μ‚°ν–ˆμ„ λ•Œμ˜ 값듀을 μ €μž₯ν•  배열을 λ§Œλ“€μ–΄μ€€λ‹€. = >  var sums = [Int64]()

 

μ—°μ‚°μž 배열을 넣을 집합을 λ§Œλ“€μ–΄μ€€λ‹€.(μ§‘ν•©μœΌλ‘œ λ§Œλ“œλŠ” μ΄μœ λŠ” 쀑볡을 μ—†μ•  μ£Όμ–΄μ§„ μ—°μ‚°μžμ˜ 갯수λ₯Ό μ•Œμ•„λ‚΄μ•Όλ˜κΈ° λ•Œλ¬Έμ΄λ‹€.) => var oper = Set<String>()

 

exprssion을 ν•„ν„°λ‘œ μ—°μ‚°μžμΌλ•Œλ‘œ 걸러주고 맡으둜 λ°°μ—΄λ‘œ λ§Œλ“€μ–΄μ€˜ ν¬ν•¨λ˜μ–΄ μžˆλŠ” μ—°μ‚°μžλ“€μ„ λ‹΄μ•„μ€€λ‹€.

=> var operArray = expression.filter({$0 == "+" || $0 == "-" || $0 == "*"}).map{String($0)} ex) "50+3-10*6+9"이라면 opreArrayλŠ” ["+",-","*","+"]

 

formUnion을 μ‚¬μš©ν•΄ 집합에 μœ„μ˜ μ—°μ‚°μžλ“€μ„ 담은 배열을 λ„£μ–΄μ€˜ 쀑볡을 μ—†μ• μ€€λ‹€.

=> oper.formUnion(operArray)

 

μš°μ„ μˆœμœ„μ‘°ν•©μ„ λ§Œλ“€κΈ°μœ„ν•΄μ„  μ§‘ν•©μ˜ 인덱슀λ₯Ό μ‚¬μš©ν•΄μ•Όν•˜λ―€λ‘œ 집합을 λ°°μ—΄λ‘œ λ°”κΏ”μ€€λ‹€.(μ§‘ν•©μ˜ 인덱슀λ₯Ό μ‚¬μš©ν•΄λ„ λ˜μ§€λ§Œ 배열이 νŽΈν•΄μ„œ λ°°μ—΄λ‘œ λ°”κΏ”μ€Œ) => let operSetArray = Array(oper)

 

 μ—°μ‚°μž κ°œμˆ˜κ°€ 1κ°œμ—μ„œ μ΅œλŒ€ 3κ°œμ΄λ―€λ‘œ 각각의 경우의 μˆ˜λŠ” 1!,2!,3!μ΄λ―€λ‘œ μ–Όλ§ˆλ˜μ§€ μ•Šμ•„μ„œ 직접 order에 쑰합을 λ§Œλ“€μ–΄μ„œ λ„£μ–΄μ€¬μŠ΅λ‹ˆλ‹€.

   => if oper.count == 1 {

        order.append([operSetArray[0]]) => ex) ["+"] or  ["-"] or ["*"]

    } else if oper.count == 2 {

λ§Œμ•½ +,-일경우

        order = [[operSetArray[0],operSetArray[1]],[operSetArray[1],operSetArray[0]]] => ex) ["+","-"],["-",+"]

    }else{

        order = [[operSetArray[0],operSetArray[1],operSetArray[2]],[operSetArray[0],operSetArray[2],operSetArray[1]],[operSetArray[1],operSetArray[0],operSetArray[2]],[operSetArray[1],operSetArray[2],operSetArray[0]],[operSetArray[2],operSetArray[1],operSetArray[0]],[operSetArray[2],operSetArray[0],operSetArray[1]]]

=> ex) ["+","-","*"],["+","*","-"].....

    }

 

κ·Έ λ‹€μŒμœΌλ‘œ for문을 μ‚¬μš©ν•˜μ—¬ order에 μžˆλŠ” 쑰합듀을 μ°¨λ‘€λ‘œ λŒλ €μ€λ‹ˆλ‹€.

=> for c in order {...}

 

expression을 μ—°μ‚°μžλ₯Ό κΈ°μ€€μœΌλ‘œ λΆ„λ¦¬ν•΄μ„œ μˆ«μžλ“€λ§Œ λ”°λ‘œ numbers에 λ‹΄μ•„μ€λ‹ˆλ‹€.

=> numbers = expression.components(separatedBy: CharacterSet(charactersIn: "*-+")) ex)"50+3-10" 이라면 number = ["50"],["3"],["10"]

 

expressionμ—μ„œ μ—°μ‚°μžλ“€λ§Œ λͺ¨μ€ 배열값을 λ„£μ–΄μ€λ‹ˆλ‹€.. (뒀에 operArrayκ°€ μ‚­μ œλ˜κΈ° λ•Œλ¬Έμ— λ°˜λ“œμ‹œ λ‹€μ‹œ 값을 λ„£μ–΄μ€˜μ•Όν•©λ‹ˆλ‹€..)

 operArray = expression.filter({$0 == "+" || $0 == "-" || $0 == "*"}).map{String($0)}

 

while문을 λ§Œλ“€μ–΄μ„œ numbers의 숫자 λ°°μ—΄κ³Ό expression의 μ—°μ‚°μž 배열을 μ°¨λ‘€λ‘œ μ„žμ–΄ μ‹€μ œ μ‹μ—μ„œ μˆ«μžμ™€ μ—°μ‚°μžλ₯Ό λΆ„λ¦¬ν•œ 배열을 λ§Œλ“€μ–΄μ€λ‹ˆλ‹€. (for문을 μ‚¬μš©ν•˜μ—¬ 배열을 λ§Œλ“€μ‹œμ—” λ§Œμ•½ "50+3"이라면 숫자 50을 κ΅¬λΆ„ν•˜κΈ° νž˜λ“€μ–΄μ„œ μ΄λ ‡κ²Œ μ„žμ–΄μ„œ λ§Œλ“€μ–΄μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.)

ex) 50 + 3 - 6 + 8 * 7이라면 numbersλŠ” ["50", "+" ."3", "-", "6", "+", "8","*",'7"] 

var x = 1

        while x < numbers.count{

            numbers.insert(operArray.first!, at: x)

 

그리곀 minus,plus,multiple에 각각 ν•΄λ‹Ή 인덱슀λ₯Ό λ„£μ–΄μ€λ‹ˆλ‹€. ex) numbersκ°€ ["50", "+" ."3", "-", "6", "+", "8","*",'7"] 이라면 plus = [1,5] minus = [3] mutiple = [7]

            if operArray.first! == "-"{

                minus.append(x)

            }else if operArray.first! == "+"{

                plus.append(x)

            }else {

                multiple.append(x)

            }

            operArray.removeFirst()

            x += 2

        }

 

while문을 μ‚¬μš©ν•˜μ—¬ detectMMPλΌλŠ” μ—°μ‚°μžλ₯Ό κ΅¬λΆ„ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œμΌœμ€λ‹ˆλ‹€.

μ‹œμž‘ν•  λ•Œ λ§Œλ“€μ–΄λ†“μ€ jλ₯Ό 0으둜 λ§Œλ“€μ–΄μ€λ‹ˆλ‹€ => j = 0

        while j < c.count {

            detectMMP(c.map({$0})[j]) cλŠ” orderμ•ˆμ˜ κ°’ mapν•‘ν•΄μ£Όκ³  μ°¨λ‘€λ‘œ κΊΌλ‚΄μ€λ‹ˆλ‹€. ex)"+","-","*"

        }

 

그리곀 detectMMPλ₯Ό μ‚΄νŽ΄λ³΄λ©΄ μΈμžκ°’μœΌλ‘œ order의 μ—°μ‚°μžλ₯Ό μ°¨λ‘€λ‘œ λ°›κ²Œλ©λ‹ˆλ‹€. 

func detectMMP(_ oper:String){ 

plus,minus,multipleλ°°μ—΄μ˜ 값을 μ €μž₯ν•  λ³€μˆ˜λ₯Ό λ§Œλ“€μ–΄μ€Œ => var mmpCopy = [Int]()

 

그리고 μ°¨λ‘€λ‘œ "+","-","*"일 κ²½μš°μ— numbers의 각 λ°°μ—΄μ˜ ν•΄λ‹ΉμΈλ±μŠ€ 자리의 - 1κ°’κ³Ό ν•΄λ‹ΉμΈλ±μŠ€μ˜ +1 값을 μ—°μ‚°μžμ— 맞게 μ—°μ‚°ν•΄μ€λ‹ˆλ‹€.

numbersκ°€ ["50", "+" ."3", "-", "6", "+", "8","*",'7"] 이고 "+"일 κ²½μš°μ—” plusλŠ” κ°€μž₯ 첫번째 μΈλ±μŠ€κ°€ 1μ΄λ―€λ‘œ numbers의 -1μžλ¦¬λŠ” 0이고 +1 μžλ¦¬λŠ” 2μ΄λ―€λ‘œ 각각 50 + 3이되고 numbers[0]의 값은 53으둜 λ³€ν•˜κ³  μ „μ²΄λŠ” ["53", "+" ."3", "-", "6", "+", "8","*",'7"]이 λ©λ‹ˆλ‹€.

   => if oper == "+" {

        mmpCopy = plus

        numbers[plus.first! - 1=  "\(Int(numbers[plus.first! - 1])! +  Int(numbers[plus.first! + 1])!)"

 

그리고 plus의 첫번째 값을 μ‚­μ œν•΄μ£Όκ³ 

   => plus.removeFirst()

 

λ§Œμ•½ plusκ°€ ν•œ κ°œκ°€ μ•„λ‹μ‹œμ—” j값을 λ”ν•΄μ£Όμ§€μ•Šμ•„ λ‹€μ‹œ whileλ¬Έμ—μ„œ "+"κ°€ μ˜€λ„λ‘ν•©λ‹ˆλ‹€.

        if plus.isEmpty {

            j += 1

        }

 

그리고 numbersμ—μ„œ ν•΄λ‹Ή 인덱슀의 μ—°μ‚°μžμ™€ 뒀에 더해쀀 값을 μ‚­μ œμ‹œμΌœμ€λ‹ˆλ‹€.

ex)  ["53", "+" ."3", "-", "6", "+", "8","*",'7"]  ->  ["53",  "-", "6", "+", "8","*",'7"] 

   numbers.remove(at: mmpCopy.first!)

   numbers.remove(at: mmpCopy.first!)

 

그리고 numbersμ—μ„œ μ—°μ‚°μžμ™€ 더해쀀 값이 총 2κ°œκ°€ μ—†μ–΄μ§€λ―€λ‘œ κ·Έ 뒀에 μ‹λ“€μ˜ 인덱슀λ₯Ό -2λ₯Ό ν•΄μ€λ‹ˆλ‹€.

ex) numbers = ["53", "+" ."3", "-", "6", "+", "8","*",'7"] 라면 뒀에 "+'와 "3"이 μ—†μ–΄μ§€λ―€λ‘œ ["53", "-", "6", "+", "8","*",'7"]

minus = [3]μ—μ„œ  -> miuns [1]으둜 mutiple = [7]μ—μ„œ multiple [5]둜 λ°”λ€Œκ²Œ λ©λ‹ˆλ‹€.

    plus = plus.filter{$0 <= mmpCopy.first!}.map{$0} + plus.filter{$0 > mmpCopy.first!}.map{$0-2}

 

κ·Έ λ‹€μŒ λ‹€μ‹œ solution으둜 λŒμ•„κ°€μ„œ numbers의 ν•˜λ‚˜λ‚¨μ€ 값을 μ ˆλŒ€κ°’μœΌλ‘œ λ³€ν˜•μ— sums에 λ„£μ–΄μ€λ‹ˆλ‹€.(μ ˆλŒ€κ°’μœΌλ‘œ λ³€ν˜•ν•˜κΈ° μœ„ν•΄μ„  Int64ν˜•μœΌλ‘œ λ°”κΏ”μ€˜μ•Όν•¨) => sums.append(abs(Int64(numbers.first!)!))

 

λ§ˆμ§€λ§‰μœΌλ‘œ μ΄λ ‡κ²Œ μΆ”κ°€λœ sumsμ—μ„œ κ°€μž₯ 큰 값을 λ°˜ν™˜ν•΄μ€λ‹ˆλ‹€. => return sums.max()!

 

 

μ „μ²΄μ½”λ“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import Foundation
 
//- μ—°μ‚°μžμ˜ indexλ₯Ό λ‹΄μ„ λ°°μ—΄
var minus = [Int]()
//* μ—°μ‚°μžμ˜ indexλ₯Ό λ‹΄μ„ λ°°μ—΄
var multiple = [Int]()
//+ μ—°μ‚°μžμ˜ indexλ₯Ό λ‹΄μ„ λ°°μ—΄
var plus = [Int]()
//식을 λ‹΄μ„ λ°°μ—΄
var numbers = [String]()
//while문에 ν•„μš”ν•œ μˆ«μž
var j = Int()
 
func solution(_ expression:String-> Int64 {
    
    //μ—°μ‚°μž μš°μ„ μˆœμœ„ μ‘°ν•©λ“€μ„ λ‹΄μ„ 2차원배열
    var order = [[String]]()
    //각 μš°μ„ μˆœμœ„ μ—°μ‚°ν–ˆμ„λ•Œ λ„£μ–΄μ€„ κ°’
    var sums = [Int64]()
    //μ—°μ‚°μž λ°°μ—΄μ„ λ„£μ„ μ§‘ν•©
    var oper = Set<String>()
    //exprssion에 ν¬ν•¨λ˜μ–΄ μžˆλŠ” μ—°μ‚°μž λ°°μ—΄
    var operArray = expression.filter({$0 == "+" || $0 == "-" || $0 == "*"}).map{String($0)}
    //Set oper에 mmpλ₯Ό λ„£μ–΄μ€˜μ„œ μ€‘볡을 μ—†μ•€λ‹€
     oper.formUnion(operArray)
    //μš°μ„ μˆœμœ„μ‘°ν•©μ„ λ§Œλ“€κΈ° μœ„ν•΄ Setλ₯Ό λ°°μ—΄λ‘œ λ§Œλ“€μ–΄μ€Œ
    let operSetArray = Array(oper)
    
    //μ—°μ‚°μž κ°―수만큼 μš°μ„ μˆœμœ„ μ‘°ν•©
    if oper.count == 1 {
        order.append([operSetArray[0]])
    } else if oper.count == 2 {
        order = [[operSetArray[0],operSetArray[1]],[operSetArray[1],operSetArray[0]]]
    }else{
        order = [[operSetArray[0],operSetArray[1],operSetArray[2]],[operSetArray[0],operSetArray[2],operSetArray[1]],[operSetArray[1],operSetArray[0],operSetArray[2]],[operSetArray[1],operSetArray[2],operSetArray[0]],[operSetArray[2],operSetArray[1],operSetArray[0]],[operSetArray[2],operSetArray[0],operSetArray[1]]]
    }
    
    //μš°μ„ μˆœμœ„μ‘°ν•©μ„ μˆœμ„œλŒ€λ‘œ κΊΌλ‚Ό forλ¬Έ
    for c in order {
        //μ—°μ‚°μžλ₯Ό κΈ°μ€€μœΌλ‘œ μˆ«μžλ“€μ„ λ‚˜λˆ μ„œ λ‹΄μ•„μ€€λ‹€.
        numbers = expression.components(separatedBy: CharacterSet(charactersIn: "*-+"))
        //μ—°μ‚°μžλ“€λ§Œ μžˆλŠ” λ°°μ—΄μ„ λ‹€μ‹œ λ³΅κ΅¬
        operArray = expression.filter({$0 == "+" || $0 == "-" || $0 == "*"}).map{String($0)}
        var x = 1
        //μˆ«μžλ“€κ³Ό μ—°μ‚°μžλ“€μ„ κ° μœ„μΉ˜μ— λ§žκ²Œ λ°°μ—΄λ‘œ λ§Œλ“€μ–΄μ€€λ‹€.
        while x < numbers.count{
            numbers.insert(operArray.first!, at: x)
            if operArray.first! == "-"{
                minus.append(x)
            }else if operArray.first! == "+"{
                plus.append(x)
            }else {
                multiple.append(x)
            }
            operArray.removeFirst()
            x += 2
        }
 
        j = 0
        
        //jκ°€ μ—°μ‚°μžμ˜ κ°―μˆ˜λ³΄λ‹€ μ λ‹€λ©΄μ„ μ‘°κ±΄μœΌλ‘œ while문을 λŒλ¦Ό
        while j < c.count {
            //detectMMP에 +,-,* μΈμ§€ λ„£μ–΄μ€Œ
            detectMMP(c.map({$0})[j])
        }
        //λ§ˆμ§€λ§‰μœΌλ‘œ λ‚¨μ€ numbers의 μ ˆλŒ€κ°’을 κ°’을 μ €μž₯ν•˜λŠ” sums에 λ„£μ–΄μ€Œ
        sums.append(abs(Int64(numbers.first!)!))
    }
    //sums에 μžˆλŠ” μ œμΌ ν° μˆ˜λ₯Ό returnν•΄μ€€λ‹€.
    return sums.max()!
}
 
func detectMMP(_ oper:String){
    
    var mmpCopy = [Int]()
    
    //λ§Œμ•½ μš°μ„ μˆœμœ„쑰합쀑 μ°¨λ‘€λ‘œ μ—°μ‚°μžλ₯Ό μ•Œμ•„λ‚΄κ³  plusλ°°μ—΄μ—μ„œ κ°€μž₯ μ²«λ²ˆμ§Έ μΈλ±μŠ€λ₯Ό μ°Ύκ³  numbersμ—μ„œ κ·Έ κΈ°ν˜Έ μ•ž λ’€μ˜ μˆ«μžλ“€μ„ κ° μ—°μ‚°κΈ°ν˜Έμ— λ§žκ²Œ ν•΄μ€€λ‹€.
    if oper == "+" {
        mmpCopy = plus
        numbers[plus.first! - 1=  "\(Int(numbers[plus.first! - 1])! +  Int(numbers[plus.first! + 1])!)"
        //연산이 λλ‚˜λ©΄ ν•΄λ‹Ή μ—°μ‚°μžλ₯Ό λ‹΄λŠ” λ°°μ—΄μ˜ μ²«λ²ˆμ§Έ μΈλ±μŠ€λ₯Ό μ‚­μ œν•΄μ€€λ‹€.
        plus.removeFirst()
        //λ§Œμ•½ μ—°μ‚°κΈ°ν˜Έκ°€ μ—¬λŸ¬κ°œμΌλ• jλ₯Ό κ·ΈλŒ€λ‘œ μœ μ§€ν•΄ λ‹€μ‹œ κ·Έ μ—°μ‚°μžλ‘œ λ˜λŒμ•„μ˜€κ²Œν•œλ‹€.
        if plus.isEmpty {
            j += 1
        }
    }else if oper == "-" {
        mmpCopy = minus
        numbers[minus.first! - 1=  "\(Int(numbers[minus.first! - 1])! -  Int(numbers[minus.first! + 1])!)"
        minus.removeFirst()
        if minus.isEmpty {
            j += 1
        }
 
    }else if oper == "*"{
        mmpCopy = multiple
        numbers[multiple.first! - 1=  "\(Int(numbers[multiple.first! - 1])! *  Int(numbers[multiple.first! + 1])!)"
        multiple.removeFirst()
        if multiple.isEmpty {
            j += 1
        }
   }

   //μ‹μ—μ„œ μ‚­μ œν•΄μ€€ μ—°μ‚°μžμ˜ μœ„μΉ˜λ₯Ό μ‚­μ œν•΄μ€€λ‹€. ν•œλ²ˆ λ” ν•΄μ£ΌλŠ” μ΄μœ λŠ” λ‘ μˆ«μžλ₯Ό μ—°μ‚°ν•˜λ©΄ μ—°μ‚°μž λ’€μ˜ μˆ«μžκ°€ μžλ™μœΌλ‘œ μ—†μ–΄μ§€κΈ° λ•Œλ¬Έμ΄λ‹€.
    numbers.remove(at: mmpCopy.first!)
    numbers.remove(at: mmpCopy.first!)

    //κ·Έ λ‹€μŒ κ° μ—°μ‚°μžμ˜ μΈλ±μŠ€ μ€‘ μ „에 μ‚­μ œλœ μΈλ±μŠ€λ³΄λ‹€ ν° κ°’이라면 -2λ₯Ό ν•΄μ€€λ‹€. μ™œλƒν•˜λ©΄ μ—°μ‚°μžμ™€ λ‘ μˆ«μžκ°€ μ—°μ‚°λ˜μ–΄ ν•˜λ‚˜μ˜ μˆ«μžκ°€ λ˜λ―€λ‘œ 2개의 κ°’이 μ‚­μ œλœλ‹€.
    plus = plus.filter{$0 <= mmpCopy.first!}.map{$0} + plus.filter{$0 > mmpCopy.first!}.map{$0-2}
    multiple = multiple.filter{$0 <= mmpCopy.first!}.map{$0} + multiple.filter{$0 > mmpCopy.first!}.map{$0-2}
    minus = minus.filter{$0 <= mmpCopy.first!}.map{$0} + minus.filter{$0 > mmpCopy.first!}.map{$0-2}
    
 
}
 
cs

μƒˆλ‘­κ²Œ μ•Œκ²Œ λœκ²ƒλ“€

Set에 λ°°μ—΄ 전체λ₯Ό λ„£κΈ°μœ„ν•΄μ„  Set.formUnion(Array)

 

Stringμ—μ„œ μ—¬λŸ¬κ°œμ˜ separatorλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ String.components(separatedBy: CharacterSet(charactersIn: "μ›ν•˜λŠ”κ²ƒλ“€"))

 

μ ˆλŒ€κ°’μ„ μ•Œμ•„λ‚΄κΈ° μœ„ν•΄μ„  abs(Int64(Number))

728x90
λ°˜μ‘ν˜•