๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โŒจ๏ธ Language/swift

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค LV.1] ๋‹คํŠธ ๊ฒŒ์ž„

by hyebin (Helia) 2023. 2. 21.
๋ฐ˜์‘ํ˜•
ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค LV.1 ๋ชจ์Œ

๋‹คํŠธ ๊ฒŒ์ž„

๋ฌธ์ œ ์„ค๋ช…

์นด์นด์˜คํ†ก์— ๋œฌ ๋„ค ๋ฒˆ์งธ ๋ณ„! ์‹ฌ์‹ฌํ•  ๋•? ์นด์นด์˜คํ†ก ๊ฒŒ์ž„๋ณ„~

์นด์นด์˜คํ†ก ๊ฒŒ์ž„๋ณ„์˜ ํ•˜๋ฐ˜๊ธฐ ์‹ ๊ทœ ์„œ๋น„์Šค๋กœ ๋‹คํŠธ ๊ฒŒ์ž„์„ ์ถœ์‹œํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ๋‹คํŠธ ๊ฒŒ์ž„์€ ๋‹คํŠธํŒ์— ๋‹คํŠธ๋ฅผ ์„ธ ์ฐจ๋ก€ ๋˜์ ธ ๊ทธ ์ ์ˆ˜์˜ ํ•ฉ๊ณ„๋กœ ์‹ค๋ ฅ์„ ๊ฒจ๋ฃจ๋Š” ๊ฒŒ์ž„์œผ๋กœ, ๋ชจ๋‘๊ฐ€ ๊ฐ„๋‹จํžˆ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ“ ์ž…์‚ฌํ•œ ๋ฌด์ง€๋Š” ์ฝ”๋”ฉ ์‹ค๋ ฅ์„ ์ธ์ •๋ฐ›์•„ ๊ฒŒ์ž„์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์ธ ์ ์ˆ˜ ๊ณ„์‚ฐ ๋กœ์ง์„ ๋งก๊ฒŒ ๋˜์—ˆ๋‹ค. ๋‹คํŠธ ๊ฒŒ์ž„์˜ ์ ์ˆ˜ ๊ณ„์‚ฐ ๋กœ์ง์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ๋‹คํŠธ ๊ฒŒ์ž„์€ ์ด 3๋ฒˆ์˜ ๊ธฐํšŒ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
  2. ๊ฐ ๊ธฐํšŒ๋งˆ๋‹ค ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ ์ˆ˜๋Š” 0์ ์—์„œ 10์ ๊นŒ์ง€์ด๋‹ค.
  3. ์ ์ˆ˜์™€ ํ•จ๊ป˜ Single(S), Double(D), Triple(T) ์˜์—ญ์ด ์กด์žฌํ•˜๊ณ  ๊ฐ ์˜์—ญ ๋‹น์ฒจ ์‹œ ์ ์ˆ˜์—์„œ 1 ์ œ๊ณฑ, 2 ์ œ๊ณฑ, 3 ์ œ๊ณฑ (์ ์ˆ˜ 1 , ์ ์ˆ˜ 2 , ์ ์ˆ˜ 3 )์œผ๋กœ ๊ณ„์‚ฐ๋œ๋‹ค.
  4. ์˜ต์…˜์œผ๋กœ ์Šคํƒ€์ƒ(*) , ์•„์ฐจ์ƒ(#)์ด ์กด์žฌํ•˜๋ฉฐ ์Šคํƒ€์ƒ(*) ๋‹น์ฒจ ์‹œ ํ•ด๋‹น ์ ์ˆ˜์™€ ๋ฐ”๋กœ ์ „์— ์–ป์€ ์ ์ˆ˜๋ฅผ ๊ฐ 2๋ฐฐ๋กœ ๋งŒ๋“ ๋‹ค. ์•„์ฐจ์ƒ(#) ๋‹น์ฒจ ์‹œ ํ•ด๋‹น ์ ์ˆ˜๋Š” ๋งˆ์ด๋„ˆ์Šค๋œ๋‹ค.
  5. ์Šคํƒ€์ƒ(*)์€ ์ฒซ ๋ฒˆ์งธ ๊ธฐํšŒ์—์„œ๋„ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ์Šคํƒ€์ƒ(*)์˜ ์ ์ˆ˜๋งŒ 2๋ฐฐ๊ฐ€ ๋œ๋‹ค. (์˜ˆ์ œ 4๋ฒˆ ์ฐธ๊ณ )
  6. ์Šคํƒ€์ƒ(*)์˜ ํšจ๊ณผ๋Š” ๋‹ค๋ฅธ ์Šคํƒ€์ƒ(*)์˜ ํšจ๊ณผ์™€ ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ค‘์ฒฉ๋œ ์Šคํƒ€์ƒ(*) ์ ์ˆ˜๋Š” 4๋ฐฐ๊ฐ€ ๋œ๋‹ค. (์˜ˆ์ œ 4๋ฒˆ ์ฐธ๊ณ )
  7. ์Šคํƒ€์ƒ(*)์˜ ํšจ๊ณผ๋Š” ์•„์ฐจ์ƒ(#)์˜ ํšจ๊ณผ์™€ ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ค‘์ฒฉ๋œ ์•„์ฐจ์ƒ(#)์˜ ์ ์ˆ˜๋Š” -2๋ฐฐ๊ฐ€ ๋œ๋‹ค. (์˜ˆ์ œ 5๋ฒˆ ์ฐธ๊ณ )
  8. Single(S), Double(D), Triple(T)์€ ์ ์ˆ˜๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์กด์žฌํ•œ๋‹ค.
  9. ์Šคํƒ€์ƒ(*), ์•„์ฐจ์ƒ(#)์€ ์ ์ˆ˜๋งˆ๋‹ค ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.

0~10์˜ ์ •์ˆ˜์™€ ๋ฌธ์ž S, D, T, *, #๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด์ด ์ž…๋ ฅ๋  ์‹œ ์ด์ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋ผ.

์ž…๋ ฅ ํ˜•์‹

"์ ์ˆ˜|๋ณด๋„ˆ์Šค|[์˜ต์…˜]"์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด 3์„ธํŠธ.

ex) 1S2D*3T

  • ์ ์ˆ˜๋Š” 0์—์„œ 10 ์‚ฌ์ด์˜ ์ •์ˆ˜์ด๋‹ค.
  • ๋ณด๋„ˆ์Šค๋Š” S, D, T ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
  • ์˜ต์…˜์€ *์ด๋‚˜ # ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค.

์ถœ๋ ฅ ํ˜•์‹

3๋ฒˆ์˜ ๊ธฐํšŒ์—์„œ ์–ป์€ ์ ์ˆ˜ ํ•ฉ๊ณ„์— ํ•ด๋‹นํ•˜๋Š” ์ •์ˆ˜๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.
ex) 37

์ž…์ถœ๋ ฅ ์˜ˆ

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ


์ œ์ถœ

 

func solution(_ dartResult:String) -> Int {
    var current = -1
    var ten = 0
    var re = [0, 0, 0]
    
    for i in dartResult{
        switch i{
        case "0"..."9":
            if ten == 0{
                current += 1
                re[current] = Int(String(i))!
            }
            else{
                re[current] = 10
            }
            if i == "1"{
                ten = 1
            }
            break
        case "S":
            ten = 0
            break
        case "D":
            ten = 0
            re[current] *= re[current]
            break
        case "T":
            ten = 0
            re[current] = re[current] * re[current] * re[current]
            break
        case "*":
            if(current == 0){
                re[current] *= 2
            }else{
                re[current-1] *= 2
                re[current] *= 2
            }
            break
        case "#":
            re[current] *= -1
            break
        default:
            break
        }
    }
    
    return re.reduce(0,+)
}
switch-case๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ๋ฐ›์€ ๋ฌธ์ž์—ด์˜ ๋ฌธ์ž์— ๋”ฐ๋ผ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
์ˆซ์ž๋ผ๋ฉด re๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค. (์ˆซ์ž๋Š” 0๋ถ€ํ„ฐ 10๊นŒ์ง€ ์ด๊ธฐ ๋•Œ๋ฌธ์—, ten ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ˆซ์ž๊ฐ€ 1์ธ๊ฒฝ์šฐ ๋‹ค์Œ์— 0์ด ๋ผ๋ฉด 10์„ ์ €์žฅํ•œ๋‹ค.)
"D", "T"์ธ ๊ฒฝ์šฐ ๊ฐ๊ฐ ์ ์ˆ˜๋ฅผ 2์ œ๊ณฑ, 3์ œ๊ณฑํ•œ๋‹ค.
"*"์ธ ๊ฒฝ์šฐ, ํ˜„์žฌ ์ ์ˆ˜๊ฐ€ ์ฒซ ๋ฒˆ์งธ๋ผ๋ฉด ํ˜„์žฌ ์ ์ˆ˜๋งŒ, ์•„๋‹ˆ๋ผ๋ฉด ์ด์ „ ์ ์ˆ˜๊นŒ์ง€ 2๋ฐฐ ํ•œ๋‹ค.
"#"์ธ ๊ฒฝ์šฐ, ํ˜„์žฌ ์ ์ˆ˜์— -1์„ ๊ณฑํ•ด ์Œ์ˆ˜๋กœ ๋งŒ๋“ ๋‹ค.

์ ์ˆ˜๋ฅผ ์ €์žฅํ•œ re ๋ฐฐ์—ด์„ reduce๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ์ ์ˆ˜์˜ ํ•ฉ์„ ๊ตฌํ•ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋‹ค๋ฅธ ํ’€์ด

func solution(_ dartResult:String) -> Int {
    let numberList = dartResult.split(whereSeparator: {$0.isLetter || $0 == "#" || $0 == "*"}).map{Int($0)!}
    let letterList = dartResult.split(whereSeparator: {$0.isNumber})
    var result = [0, 0 ,0]
    
    for (i, (number, letter)) in zip(numberList, letterList).enumerated() {
        var n = letter.contains("D") ? number*number : (letter.contains("T") ? number*number*number : number)
        
        if letter.contains("*"){
            if i != 0{
                result[i-1] *= 2
            }
            n*=2
        }else if letter.contains("#"){
            n *= -1
        }
        
        result[i] = n
    }

    return result.reduce(0, +)
}
์ž…๋ ฅ๋ฐ›์€ ๋ฌธ์ž์—ด์„ ์ˆซ์ž๋งŒ ์žˆ๋Š” ์ •์ˆ˜ํ˜• ๋ฐฐ์—ด numberList์™€ ๋ฌธ์ž๋กœ๋งŒ ๊ตฌ์„ฑ๋œ Stringํ˜• ๋ฐฐ์—ด letterList๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
ex) 1S2D*3T
numberList = [1, 2, 3]
letterList = ["S", "D*", "T"]

numberList์™€ letterList๋ฅผ zip์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐํ•ฉํ•œ๋‹ค. 
๋ฌธ์ž์— D๊ฐ€ ์žˆ๋‹ค๋ฉด 2์ œ๊ณฑ, T๊ฐ€ ์žˆ๋‹ค๋ฉด 3์ œ๊ณฑํ•œ๋‹ค.
๋ฌธ์ž์— "*"์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ํ˜„์žฌ index๊ฐ€ 0์ด ์•„๋‹ˆ๋ผ๋ฉด ์ด์ „ ์ ์ˆ˜์— 2๋ฅผ ๊ณฑํ•œ ํ›„, ํ˜„์žฌ ์ ์ˆ˜์— 2๋ฅผ ๊ณฑํ•œ๋‹ค.
๋ฌธ์ž์— "#"์ด ์žˆ๋‹ค๋ฉด ํ˜„์žฌ ์ ์ˆ˜์— -1์„ ๊ณฑํ•ด ์Œ์ˆ˜๋กœ ๋งŒ๋“ ๋‹ค.
ํ˜„์žฌ ์ ์ˆ˜๋ฅผ result ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.

result ๋ฐฐ์—ด์— reduce๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ์ ์ˆ˜์˜ ํ•ฉ์„ ๊ตฌํ•œ ํ›„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
๋ฐ˜์‘ํ˜•