ALGORITHM/Swift
[알고리즘] Swift -프로그래머스 연습문제 #181916(주사위 게임 3)
늘스토리 주인장
2023. 6. 8. 01:25
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
반응형