๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“– Problem Solution/Programmers

2020 ์นด์นด์˜ค ์ธํ„ด์‰ฝ ์ˆ˜์‹ ์ตœ๋Œ€ํ™” Swift

by Fomagran ๐Ÿ’ป 2020. 9. 3.
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
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€