주사위 게임 3

주사위 게임 3

프로그래머스 파이썬 - 주사위 게임 3

주사위 게임 3

문제

주사위 게임 3

1부터 6까지 숫자가 적힌 주사위가 네 개 있습니다. 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다.

  • 네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점을 얻습니다.
  • 세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)2 점을 얻습니다.
  • 주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) ×p - q점을 얻습니다.
  • 어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점을 얻습니다.
  • 네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.

네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 abcd로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.


제한사항

  • abcd는 1 이상 6 이하의 정수입니다.

입출력 예

abcdresult
22222222
41441681
633627
252630
64252

입출력 예 설명

입출력 예 #1

  • 예제 1번에서 네 주사위 숫자가 모두 2로 같으므로 1111 × 2 = 2222점을 얻습니다. 따라서 2222를 return 합니다.

입출력 예 #2

  • 예제 2번에서 세 주사위에서 나온 숫자가 4로 같고 나머지 다른 주사위에서 나온 숫자가 1이므로 (10 × 4 + 1)2 = 412 = 1681점을 얻습니다. 따라서 1681을 return 합니다.

입출력 예 #3

  • 예제 3번에서 ad는 6으로, bc는 3으로 각각 같으므로 (6 + 3) ×6 - 3= 9 × 3 = 27점을 얻습니다. 따라서 27을 return 합니다.

입출력 예 #4

  • 예제 4번에서 두 주사위에서 2가 나오고 나머지 다른 두 주사위에서 각각 5, 6이 나왔으므로 5 × 6 = 30점을 얻습니다. 따라서 30을 return 합니다.

입출력 예 #5

  • 예제 5번에서 네 주사위 숫자가 모두 다르고 나온 숫자 중 가장 작은 숫자가 2이므로 2점을 얻습니다. 따라서 2를 return 합니다.

풀이

def solution(a, b, c, d):
    answer = 0
    origin = [a, b, c, d]
    arr = list(set(origin))
    
    if len(arr) == 4:
        answer = min(arr)
    elif len(arr) == 3:
        max_num = max(origin, key=origin.count)
        tmp = [num for num in arr if num != max_num]
        answer = tmp[0] * tmp[1]
    elif len(arr) == 2:
        if max([origin.count(num) for num in arr]) > 2:
            max_num = max(origin, key=origin.count)
            min_num = min(origin, key=origin.count)
            answer = ((10 * max_num + min_num) ** 2)
        else:
            answer = ((arr[0] + arr[1]) * abs(arr[0] - arr[1]))
    elif len(arr) == 1:
            answer = int(str(arr[0]) * 4)
    return answer

원본을 저장할 origin 이라는 배열을 만들어주고, set을 이용해서 중복 제거를 해준 배열을 arr에 담아준다.

그리고 주사위 4개가 다를 경우는 제일 작은 숫자를 저장하면 된다.

주사위 2개만 같고 나머지는 틀릴 경우에는 arr 배열의 길이가 3개가 되며 조건에 문제 조건에 따라서 담아주면 된다.

그 다음은 주사위 2개씩 같은 상항과 3개가 같고 1개가 틀린 경우인데 이 부분은 조건으로 나눠줘야 한다.

arr 배열에서 반복문을 사용해서 원본 배열에서 count을 사용해서 배열을 만드는데 이중에서 제일 큰 숫자를 가져오는데 2보다 큰 경우는 주사위 3개가 같고 1개가 틀린 상항이다.

마찬가지로 조건에 맞게 담아주고 else를 사용해서 주사위 2개씩 같은 상항도 조건에 맞게 담아준다.

마지막으로 주사위 4개가 같으면 arr 배열에는 1개가 남으므로 조건에 맞게 저장해준다.


© 2021. All rights reserved.

Powered by Hydejack v9.1.6