πŸ§‘πŸ»‍πŸ’» Coding Test/⌨️ Programmers

[ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ ] [1μ°¨] λ‹€νŠΈκ²Œμž„

EarthSea 2024. 3. 18. 13:59

 

 

πŸ„ μ½”λ”©ν…ŒμŠ€νŠΈ

μ½”λ”©ν…ŒμŠ€νŠΈ 문제 풀이

✍🏻 Github

문제 풀이 github 링크

 

 

문제 μ„€λͺ…

μΉ΄μΉ΄μ˜€ν†‘μ— 뜬 λ„€ 번째 별! 심심할 땐? μΉ΄μΉ΄μ˜€ν†‘ κ²Œμž„λ³„~

μΉ΄μΉ΄μ˜€ν†‘ κ²Œμž„λ³„μ˜ ν•˜λ°˜κΈ° μ‹ κ·œ μ„œλΉ„μŠ€λ‘œ λ‹€νŠΈ κ²Œμž„μ„ μΆœμ‹œν•˜κΈ°λ‘œ ν–ˆλ‹€. λ‹€νŠΈ κ²Œμž„μ€ λ‹€νŠΈνŒμ— λ‹€νŠΈλ₯Ό μ„Έ μ°¨λ‘€ 던져 κ·Έ 점수의 ν•©κ³„λ‘œ μ‹€λ ₯을 κ²¨λ£¨λŠ” κ²Œμž„μœΌλ‘œ, λͺ¨λ‘κ°€ κ°„λ‹¨νžˆ 즐길 수 μžˆλ‹€.

κ°“ μž…μ‚¬ν•œ λ¬΄μ§€λŠ” μ½”λ”© μ‹€λ ₯을 인정받아 κ²Œμž„μ˜ 핡심 뢀뢄인 점수 계산 λ‘œμ§μ„ 맑게 λ˜μ—ˆλ‹€. λ‹€νŠΈ κ²Œμž„μ˜ 점수 계산 λ‘œμ§μ€ μ•„λž˜μ™€ κ°™λ‹€.

  1. λ‹€νŠΈ κ²Œμž„μ€ 총 3번의 기회둜 κ΅¬μ„±λœλ‹€.
  2. 각 κΈ°νšŒλ§ˆλ‹€ 얻을 수 μžˆλŠ” μ μˆ˜λŠ” 0μ μ—μ„œ 10μ κΉŒμ§€μ΄λ‹€.
  3. μ μˆ˜μ™€ ν•¨κ»˜ Single(S), Double(D), Triple(T) μ˜μ—­μ΄ μ‘΄μž¬ν•˜κ³  각 μ˜μ—­ 당첨 μ‹œ μ μˆ˜μ—μ„œ 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μ„ΈνŠΈ.

예) 1S2D*3T

  • μ μˆ˜λŠ” 0μ—μ„œ 10 μ‚¬μ΄μ˜ μ •μˆ˜μ΄λ‹€.
  • λ³΄λ„ˆμŠ€λŠ” S, D, T 쀑 ν•˜λ‚˜μ΄λ‹€.
  • μ˜΅μ„ μ€ *μ΄λ‚˜ # 쀑 ν•˜λ‚˜μ΄λ©°, 없을 μˆ˜λ„ μžˆλ‹€.

좜λ ₯ ν˜•μ‹

3번의 κΈ°νšŒμ—μ„œ 얻은 점수 합계에 ν•΄λ‹Ήν•˜λŠ” μ •μˆ˜κ°’μ„ 좜λ ₯ν•œλ‹€.

예) 37

 

μž…μΆœλ ₯ 예제

예제 dartResult answer μ„€λͺ…
1 1S2D*3T 37 11 * 2 + 22 * 2 + 33
2 1D2S#10S 9 12 + 21 * (-1) + 101
3 1D2S0T 3 12 + 21 + 03
4 1S2T3S 23 11 * 2 * 2 + 23 * 2 + 31
5 1D#2S*3S 5 12 * (-1) * 2 + 21 * 2 + 31
6 1T2D3D# -4 13 + 22 + 32 * (-1)
7 1D2S3T* 59 12 + 21 * 2 + 33 * 2

 

 

문제 풀이

λ‚˜μ˜ 풀이

func solution(_ dartResult:String) -> Int {
    
    // 전에 λ“€μ–΄μ˜¨ 숫자 μ €μž₯
    var beforeNum = 0
    // 방금 λ“€μ–΄μ˜¨ 숫자 μ €μž₯
    var nowNum = 0
    // 총 ν•©
    var totalNum = 0
    // 전에 λ“€μ–΄μ˜¨ 숫자λ₯Ό 총합에 μ €μž₯ν•˜κΈ° μœ„ν•΄ λ“€μ–΄μ˜¨ 숫자의 개수λ₯Ό ν—€μ•„λ¦Ό
    var count = 0
    var dartResult = Array(dartResult)
    
    while !dartResult.isEmpty {
        
        if let num = Int(String(dartResult.prefix(2))){
            if count == 2 {
                totalNum += beforeNum
            }
            beforeNum = nowNum
            nowNum = num
            count += 1
            dartResult.removeFirst(2)
            continue
        }
        if let num = Int(String(dartResult.first!)) {
            if count == 2 {
                totalNum += beforeNum
            }
            beforeNum = nowNum
            nowNum = num
            count += 1
            dartResult.removeFirst()
            continue
        }
        
        switch dartResult.first! {
        case "D":
            nowNum = nowNum * nowNum
        case "T":
            nowNum = nowNum * nowNum * nowNum
        case "*":
            nowNum = 2 * nowNum
            beforeNum = 2 * beforeNum
        case "#":
            nowNum = -nowNum
        default: //"S"
            break
        }
        dartResult.removeFirst()
    }
    totalNum += beforeNum
    totalNum += nowNum
    
    return totalNum
}

 

μš°μ„  이 문제λ₯Ό ν’€κΈ° μœ„ν•΄μ„œλŠ” λ¬Έμžμ—΄μ„ μˆ«μžμ™€ 문자둜 λ‚˜λˆ„κ³ , λ¬Έμžμ— λ”°λ₯Έ 쑰건을 λ„£μ–΄μ•Όκ² λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€.

ν•˜μ§€λ§Œ 문자의 μŠ€νƒ€μƒ(*)이 μžμ‹ κ³Ό κ·Έ 전에 λ‚˜μ™”λ˜ κ²ƒμ˜ 값을 2배둜 λ³€κ²½ν•΄μ£Όμ–΄μ•Ό ν•΄μ„œ 전에 λ‚˜μ™”λ˜ 값을 μ €μž₯ν•  λ³€μˆ˜κ°€ ν•„μš”ν–ˆλ‹€.

 

→ μ΄μ „μ˜ κ°’

→ ν˜„μž¬μ˜ κ°’

→ λͺ‡ 번째 μˆ«μžμΈμ§€ 카운트

→ 전체 ν•©

 

κ·Έλž˜μ„œ μ΄λ ‡κ²Œ λ³€μˆ˜λ₯Ό λ§Œλ“€μ–΄λ‘κ³ , if let 문으둜 μˆ«μžμΈμ§€λ₯Ό νŒŒμ•…ν•œ ν›„ μˆ«μžκ°€ μ•„λ‹ˆλΌλ©΄ switch 문을 λŒλ„λ‘ κ΅¬ν˜„ν•˜μ˜€λ‹€. countκ°€ 2κ°€ 되면 3번째의 값이 μ €μž₯λ˜μ–΄μ•Ό ν•˜λ―€λ‘œ μ²«λ²ˆμ§Έκ°’μ΄ total둜 μ €μž₯이 되고, 배열이 λλ‚˜λ©΄ λ‹€ λ”ν•˜κΈ°λ‘œ κ΅¬ν˜„ν•˜μ˜€λ‹€. μ—¬κΈ°μ„œ λ‚˜μ˜ λ¬Έμ œμ μ€ 10이 듀어왔을 λ•Œλ₯Ό ν•΄κ²°ν•˜μ§€ λͺ»ν–ˆλ‹€. κ·Έλž˜μ„œ λ‚΄κ°€ μƒκ°ν•œ 방법은 λ¨Όμ € μ•žμ˜ 2 κΈ€μžλ₯Ό κΊΌλ‚΄μ–΄ if let 문에 λŒ€μž…ν•΄λ³΄κ³  λŒ€μž…μ΄ λœλ‹€λ©΄ κ·Έ μˆ«μžλŠ” 10μ΄λ―€λ‘œ λ‹€μŒμœΌλ‘œ λ„˜μ–΄κ°€λ„λ‘ κ΅¬ν˜„μ„ ν•˜μ˜€λ‹€.

풀이λ₯Ό μ λ‹€λ³΄λ‹ˆ 3κ°€μ§€μ˜ 배열에 값을 μ €μž₯을 ν•΄μ„œ λ§ˆμ§€λ§‰μ— 배열에 μžˆλŠ” 수λ₯Ό λ”ν•˜λ©΄ μ’‹κ² λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€.

 

func solution(_ dartResult:String) -> Int {
    
    // λ¬Έμžμ—΄ λ°°μ—΄λ‘œ λ³€ν™˜
    var dartResult = Array(dartResult)
    // 방금 λ“€μ–΄μ˜¨ 숫자 μ €μž₯
    var nowNum = 0
    // 숫자 μ €μž₯
    var num = [Int]()
    
    while !dartResult.isEmpty {
        if dartResult.first!.isNumber {
            num.append(nowNum)
            if let num = Int(String(dartResult.prefix(2))){
                nowNum = num
                dartResult.removeFirst(2)
                continue
            }
            if let num = Int(String(dartResult.first!)) {
                nowNum = num
                dartResult.removeFirst()
                continue
            }
        }
        
        switch dartResult.first! {
        case "D":
            nowNum = nowNum * nowNum
        case "T":
            nowNum = nowNum * nowNum * nowNum
        case "*":
            var n = num.count
            num[n-1] *= 2
            nowNum = 2 * nowNum
        case "#":
            nowNum = -nowNum
        default: //"S"
            break
        }
        dartResult.removeFirst()
    }
    num.append(nowNum)
    
    return num.reduce(0, +)
}

 

μ–΄μ°¨ν”Ό μˆ«μžκ°€ λ”± 3κ°œκ°€ λ“€μ–΄μ˜€λ‹ˆ 맨 μ•žμ—λŠ” 항상 0을 λ°°μΉ˜ν•˜κ³  μˆœμ„œλŒ€λ‘œ 첫번째, λ‘λ²ˆμ§Έ, μ„Έλ²ˆμ§Έλ₯Ό λ„£λ„λ‘ν•˜μ—¬ 4개의 배열을 λ§Œλ“€μ—ˆλ‹€. μ²«λ²ˆμ§Έμ—λŠ” 무쑰건 0을 λ°°μΉ˜ν•œ μ΄μœ λŠ” μŠ€νƒ€μƒμ΄ 듀어왓을 κ²½μš°μ— μžμ‹ κ³Ό κ·Έ μ•žμ˜ 배열이 2λ°°κ°€ λ˜λŠ”λ° 첫번째 배열을 제일 처음으둜 λ°°μΉ˜ν–ˆμ„ λ•Œ μ—λŸ¬κ°€ λ‚˜ λ‹€λ₯Έ 쑰건이 ν•„μš”ν•˜λ‹€. 이λ₯Ό μƒλž΅ν•˜κΈ° μœ„ν•΄ μ²«λ²ˆμ§Έμ— 0을 λ°°μΉ˜ν•˜μ˜€κ³ , μΉ΄μš΄ν„°λ₯Ό λ”°λ‘œ μ„Έμ§€ μ•Šμ•„μ„œ μ½”λ“œκ°€ 더 κ°„κ²°ν•΄μ‘Œλ‹€. isNumberλΌλŠ” λ³€μˆ˜ 쑰건문도 μΆ”κ°€ν•˜μ—¬ ν•„μš”μ—†λŠ” 쑰건 비ꡐ 과정을 μƒλž΅ν–ˆλ‹€.

 

μœ„μ˜ μ½”λ“œμ™€ μ‹œκ°„μ„ λΉ„κ΅ν•΄λ³΄μž.

더보기

1번 μ½”λ“œ

ν…ŒμŠ€νŠΈ 1 〉	톡과 (0.08ms, 16.4MB)
ν…ŒμŠ€νŠΈ 2 〉	톡과 (0.09ms, 16.2MB)
ν…ŒμŠ€νŠΈ 3 〉	톡과 (0.10ms, 16.5MB)
ν…ŒμŠ€νŠΈ 4 〉	톡과 (0.08ms, 16.2MB)
ν…ŒμŠ€νŠΈ 5 〉	톡과 (0.12ms, 16.5MB)
ν…ŒμŠ€νŠΈ 6 〉	톡과 (0.09ms, 16.3MB)
ν…ŒμŠ€νŠΈ 7 〉	톡과 (0.09ms, 16.3MB)
ν…ŒμŠ€νŠΈ 8 〉	톡과 (0.09ms, 16.3MB)
ν…ŒμŠ€νŠΈ 9 〉	톡과 (0.08ms, 16.5MB)
ν…ŒμŠ€νŠΈ 10 〉	톡과 (0.14ms, 16.4MB)
ν…ŒμŠ€νŠΈ 11 〉	톡과 (0.09ms, 16.3MB)
ν…ŒμŠ€νŠΈ 12 〉	톡과 (0.08ms, 16.4MB)
ν…ŒμŠ€νŠΈ 13 〉	톡과 (0.09ms, 16.3MB)
ν…ŒμŠ€νŠΈ 14 〉	톡과 (0.09ms, 16.2MB)
ν…ŒμŠ€νŠΈ 15 〉	톡과 (0.14ms, 16.2MB)
ν…ŒμŠ€νŠΈ 16 〉	톡과 (0.12ms, 16.5MB)
ν…ŒμŠ€νŠΈ 17 〉	톡과 (0.09ms, 16.3MB)
ν…ŒμŠ€νŠΈ 18 〉	톡과 (0.14ms, 16.6MB)
ν…ŒμŠ€νŠΈ 19 〉	톡과 (0.13ms, 16.5MB)
ν…ŒμŠ€νŠΈ 20 〉	톡과 (0.15ms, 16.3MB)
ν…ŒμŠ€νŠΈ 21 〉	톡과 (0.15ms, 16.6MB)
ν…ŒμŠ€νŠΈ 22 〉	톡과 (0.11ms, 16.4MB)
ν…ŒμŠ€νŠΈ 23 〉	톡과 (0.13ms, 16.3MB)
ν…ŒμŠ€νŠΈ 24 〉	톡과 (0.09ms, 16.2MB)
ν…ŒμŠ€νŠΈ 25 〉	톡과 (0.14ms, 16.2MB)
ν…ŒμŠ€νŠΈ 26 〉	톡과 (0.14ms, 16.4MB)
ν…ŒμŠ€νŠΈ 27 〉	톡과 (0.11ms, 16.6MB)
ν…ŒμŠ€νŠΈ 28 〉	톡과 (0.14ms, 16.4MB)
ν…ŒμŠ€νŠΈ 29 〉	톡과 (0.15ms, 16.1MB)
ν…ŒμŠ€νŠΈ 30 〉	톡과 (0.09ms, 16.4MB)
ν…ŒμŠ€νŠΈ 31 〉	톡과 (0.10ms, 16.4MB)
ν…ŒμŠ€νŠΈ 32 〉	톡과 (0.10ms, 16.6MB)

2번 μ½”λ“œ

ν…ŒμŠ€νŠΈ 1 〉	톡과 (0.13ms, 16.8MB)
ν…ŒμŠ€νŠΈ 2 〉	톡과 (0.13ms, 16.5MB)
ν…ŒμŠ€νŠΈ 3 〉	톡과 (0.13ms, 16.5MB)
ν…ŒμŠ€νŠΈ 4 〉	톡과 (0.14ms, 16.7MB)
ν…ŒμŠ€νŠΈ 5 〉	톡과 (0.11ms, 16.6MB)
ν…ŒμŠ€νŠΈ 6 〉	톡과 (0.13ms, 16.6MB)
ν…ŒμŠ€νŠΈ 7 〉	톡과 (0.12ms, 16.6MB)
ν…ŒμŠ€νŠΈ 8 〉	톡과 (0.12ms, 16.6MB)
ν…ŒμŠ€νŠΈ 9 〉	톡과 (0.14ms, 16.8MB)
ν…ŒμŠ€νŠΈ 10 〉	톡과 (0.12ms, 16.7MB)
ν…ŒμŠ€νŠΈ 11 〉	톡과 (0.14ms, 16.8MB)
ν…ŒμŠ€νŠΈ 12 〉	톡과 (0.13ms, 16.6MB)
ν…ŒμŠ€νŠΈ 13 〉	톡과 (0.11ms, 16.5MB)
ν…ŒμŠ€νŠΈ 14 〉	톡과 (0.14ms, 16.8MB)
ν…ŒμŠ€νŠΈ 15 〉	톡과 (0.13ms, 16.3MB)
ν…ŒμŠ€νŠΈ 16 〉	톡과 (0.13ms, 16.5MB)
ν…ŒμŠ€νŠΈ 17 〉	톡과 (0.17ms, 16.6MB)
ν…ŒμŠ€νŠΈ 18 〉	톡과 (0.14ms, 16.6MB)
ν…ŒμŠ€νŠΈ 19 〉	톡과 (0.12ms, 16.6MB)
ν…ŒμŠ€νŠΈ 20 〉	톡과 (0.13ms, 16.6MB)
ν…ŒμŠ€νŠΈ 21 〉	톡과 (0.13ms, 16.5MB)
ν…ŒμŠ€νŠΈ 22 〉	톡과 (0.23ms, 16.8MB)
ν…ŒμŠ€νŠΈ 23 〉	톡과 (0.18ms, 16.7MB)
ν…ŒμŠ€νŠΈ 24 〉	톡과 (0.16ms, 16.4MB)
ν…ŒμŠ€νŠΈ 25 〉	톡과 (0.13ms, 16.6MB)
ν…ŒμŠ€νŠΈ 26 〉	톡과 (0.20ms, 16.5MB)
ν…ŒμŠ€νŠΈ 27 〉	톡과 (0.22ms, 16.5MB)
ν…ŒμŠ€νŠΈ 28 〉	톡과 (0.14ms, 16.5MB)
ν…ŒμŠ€νŠΈ 29 〉	톡과 (0.18ms, 16.6MB)
ν…ŒμŠ€νŠΈ 30 〉	톡과 (0.20ms, 16.8MB)
ν…ŒμŠ€νŠΈ 31 〉	톡과 (0.14ms, 16.8MB)
ν…ŒμŠ€νŠΈ 32 〉	톡과 (0.14ms, 16.8MB)

 

μ½”λ“œλŠ” κΉ”λ”ν•΄μ‘Œμ§€λ§Œ 였히렀 1λ²ˆμ½”λ“œμ˜ μ‹€ν–‰μ‹œκ°„μ΄ 더 μ§§μ•˜λ‹€.

μ΄μœ λŠ” 배열을 λ§Œλ“¬μœΌλ‘œμ¨ 총합을 λ³€μˆ˜μ— λ”ν•˜λ©΄μ„œ μ €μž₯ν•˜λŠ” 것이 μ•„λ‹Œ 4개의 배열을 ν›‘μœΌλ©΄μ„œ λ”ν•΄μ•Όν•˜λŠ” reduce μ½”λ“œκ°€ μΆ”κ°€ λ˜μ—ˆκΈ° λ•Œλ¬ΈμΈ 것 κ°™λ‹€.