코딩 테스트/프로그래머스

[Python] 프로그래머스 주사위 게임 3

위시리 2024. 10. 7. 17:43

 

문제 분석

  • 1~6까지 적힌 주사위 4개
  • 네 주사위에서 나온 숫자가 모두 p로 같으면 : 1111 x p 점 (1)
  • 세 주사위에서 나온 숫자가 p, 나머지 하나 q : (10 * p + q)**2 점 (2)
  • 두 개씩 각각 p,q로 같으면 : ( p + q ) * | p - q | (3)
  • 두 개는 p, 나머지는 q, r이면 : q * r (4)
  • 모두 다르면 가장 작은 숫자만큼 (5)

 

코드 설계

  • 딕셔너리를 이용해서 입력받는 숫자의 갯수 세기 ?
  • set 함수로 중복되는 수 갯수 찾고
  • 4라면 모두 다른 경우
  • 3이라면 1/1/2 -> 2가 어느 숫자인지 찾아야함
  • 2라면 2/2 또는 1/3
  • 1이라면 모두 같음

 

  • 해당 배열을 list에 저장
  • 각 자리의 값이 몇 번 나오는지 list.count( ) 메소드를 이용하여 계산
  • max(counts) == 4 : 모두 같은 수 (1)
  • max(counts) == 3 : 3이 나온 자리의 list = p, 1이 나온 자리 list = q (2) 
  • max(counts) == 2 : 이때 두개씩 같은 경우 or 2개는 같은데 나머지는 각각 다른 경우가 있다.
    • 두개씩 같다면 min(counts) == 2 (3)
    • 2 2 1 1 이라면 (4)

 

정답 코드

실패..

 

다른사람 풀이

def solution(a, b, c, d):
    nums = [a, b, c, d]
    counts = [nums.count(i) for i in nums]
    if max(counts) == 4:
        return a * 1111
    elif max(counts) == 3:
        p = nums[counts.index(3)]
        q = nums[counts.index(1)]
        return (10 * p + q) ** 2
    elif max(counts) == 2:
        if min(counts) == 2:
            return (a + c) * abs(a - c) if a == b else (a + b) * abs(a - b)
        else:
            p = nums[counts.index(2)]
            return (a * b * c * d) / p**2
    else:
        return min(nums)

 

1차 다시 풀어봄

def solution(a, b, c, d):
    answer = 0
    list = [a,b,c,d]
    counts = [list.count(i) for i in list]

    if max(counts) == 4 :
        answer = a * 1111
    elif max(counts) == 3 :
        p = list[counts.index(3)]
        q = list[counts.index(1)]
        answer = (10*p+q)**2
    elif max(counts) == 2 :
        if min(counts) == 2 :
            if a == b : # (a,b) (c,d)가 서로 같음
                answer = (a+c) * abs(a-c)
            else :
                answer = (a+b) * abs(a-b)

        else : # 2 2 1 1
            p = list[counts.index(2)]
            answer = a * b * c * d // p**2
    else :
        answer = min(list)

    return answer