[알고리즘] Swift -프로그래머스 연습문제 #181916(주사위 게임 3)

2023. 6. 8. 01:25ALGORITHM/Swift

728x90
반응형

 

문제링크

 

 

 

 

분석

1부터 6까지 숫자가 적힌 주사위 4개가 있다.

4 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다.

4 주사위에서 나온 숫자가 모든 p로 같다면 1111xp 점을 얻는다.

3 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)2 점을 얻는다.

주사위가 2개씩 같은 값이 나오고 나온 숫자를 p, q(p ≠ q) 라고 한다면  (p + q) × |p - q|점을 얻는다.

어느 2주사위에서 나온 숫자가 p로 같고 나머지 2주사위에서 나온 숫자가 각각 p와 다른  q, r(q ≠ r)이라면 q × r점을 얻는다.

4주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자만큼의 점수를 얻는다.

4주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a,b,c,d로 주어질 때 얻는 점수를 리턴하는 문제이다.

 

풀이 과정

4개가 모두 같은 숫자라면 = 1111 x 숫자

3개(p)가 같고 하나(q)가 다르다면 = (10 x p + q)의 제곱

2개(p)가 같고 2개(q)가 같다면 = (p + q) x | p - q |

2개(p)가 같고 2개(q, r)가 다르다면 = q x r

모두 다르다면 = 가장 작은 숫자

 

 

풀이

import Foundation

func solution(_ a:Int, _ b:Int, _ c:Int, _ d:Int) -> Int {
    let nums = [a, b, c, d]
        
    if Set(nums).count == 4 {
        return nums.min() ?? 0
    }
    
    var count = [Int: Int]()
    
    for num in nums {
        count[num] = (count[num] ?? 0) + 1
    }
    
    if Set(nums).count == 1 {
        return nums.first! * 1111
    } else if Set(nums).count == 2 {
        if count.values.contains(3) {
            let p = count.first { $0.value == 3 }!.key
            let q = nums.first { $0 != p }!
            return (10 * p + q) * (10 * p + q)
        } else {
            let p = count.keys.first!
            let q = count.keys.dropFirst().first!
            return (p + q) * abs(p - q)
        }
    } else {
        let p = count.first { $0.value == 2 }!.key
        let q = nums.first { $0 != p }!
        let r = nums.first { $0 != p && $0 != q }!
        return q * r
    }
}

 

결과

print(solution(2, 2, 2, 2))

 

 

 


📂  정리

 

 

 

 

728x90
반응형