코딩 테스트/프로그래머스
[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/31이라면 모두 같음
- 해당 배열을 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