본문 바로가기

Algorithm/프로그래머스

[Python] [코딩 기초 트레이닝] / 주사위 게임 3

[Q]

1. 4p -> 1111 * p

2. 3p + q -> (10 * p + q)^2

3. 2p + 2q -> (p+q) * |p-q|

4. 2p + q + r -> q * r

5. p + q + r + s -> min(p, q, r, s)

6. 1 <= a, b, c, d <= 6

def solution(a, b, c, d):
    answer = 0
    return answer

 

 

- len(set([a, b, c, d])) 활용

 

 

[A] (내가 쓴 답)

def solution(a, b, c, d) :
    
    answer = 0
    dice = [a, b, c, d]
    tmp = list(set(dice))
    
    if len(tmp) == 4 :
        answer = min(tmp)
        
    elif len(tmp) == 3 :
        for i in dice :
            if dice.count(i) == 2 :
                ans = [x for x in tmp if x != i]
                answer = ans[0] * ans[1]
            
    elif len(tmp) == 2 :
        for i in dice :
            if dice.count(i) == 3 :
                ans = [x for x in tmp if x != i][0]
                answer = (10 * i + ans)**2
            else :
                ans = [x for x in tmp if x != i][0]
                answer = (i + ans)*(abs(i - ans))
    else :
        answer = 1111 * tmp[0]
    
    return answer

-> 테스트 기준 40 / 42

- 두 개가 왜 실패했을까해서 반례 찾아봄 -> 1, 1, 1, 2

-  if dice.count(i) == 3에서 else를

elif dice.count(ele) == 2 :

 

로 변경하니 해결됨.

 

(수정한 답)

def solution(a, b, c, d) :

    answer = 0
    dice = [a, b, c, d]
    tmp = list(set(dice))

    if len(tmp) == 4 :
        answer = min(tmp)

    elif len(tmp) == 3 :
        for ele in dice :
            if dice.count(ele) == 2 :
                q = [x for x in tmp if x != ele]
                answer = q[0] * q[1]

    elif len(tmp) == 2 :
        for ele in dice :
            if dice.count(ele) == 3 :
                p = ele
                q = [x for x in tmp if x != ele][0]
                answer = (10 * p + q)**2
            elif dice.count(ele) == 2 :
                p = ele
                q = [x for x in tmp if x != ele][0]
                answer = (p + q)*(abs(p - q))
    else :
        answer = 1111 * tmp[0]

    return answer

 

 

[A] 다른 답들

def solution(a, b, c, d):
    l = [a,b,c,d]
    c = [l.count(x) for x in l]
    if max(c) == 4:
        return 1111*a
    elif max(c) == 3:
        return (10*l[c.index(3)]+l[c.index(1)])**2
    elif max(c) == 2:
        if min(c) == 1:
            return eval('*'.join([str(l[i]) for i, x in enumerate(c) if x == 1]))
        else:
            return (max(l) + min(l)) * abs(max(l) - min(l))
    else:
        return min(l)

 

def solution(a, b, c, d):
    answer = 0
    if a==b==c==d:
        answer=1111*a
    elif a==b==c:
        answer=(10*a+d)**2
    elif a==b==d:
        answer=(10*a+c)**2
    elif a==c==d: 
        answer=(10*a+b)**2
    elif b==c==d:
        answer=(10*d+a)**2
    elif a==b and c==d:
        answer=(a+c)*abs(a-c)
    elif a==c and b==d:
        answer=(a+b)*abs(a-b)
    elif a==d and b==c:
        answer=(a+b)*abs(a-b)
    elif a==b:
        answer=c*d
    elif a==c:
        answer=b*d
    elif a==d:
        answer=b*c
    elif b==c:
        answer=a*d
    elif b==d:
        answer=a*c
    elif c==d:
        answer=a*b
    else:
        answer=min(a,b,c,d)

    return answer