프로그래머스 주사위 게임 3 [python]
안녕하세요 머킹입니다!
오늘 자연어 처리 프로젝트도 올리고 싶었는데
아직도 코랩이 돌아가는 중이라서 못 올릴 것 같습니다.ㅎㅎ
그래서 오늘은 코딩테스트만 올리겠습니다.
저는 지금 0단계부터 차근차근 풀고 있는데요.
(아마도) 0단계에서 가장 어려운 문제를 마주쳤습니다...
문제 설명
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점을 얻습니다.
- 네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자만큼의 점수를 얻습니다.
네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 `a`, `b`, `c`, `d`로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
제한사항
- `a`, `b`, `c`, `d`는 1 이상 6 이하의 정수입니다.
def solution(a, b, c, d):
answer = 0
if a,b,c,d == p:
1111 * p
elif a,b,c == p and q(p != q):
answer == (10*p+q)
elif a,b == p:
and q != p (p+q) x p-q
else:
print(solution(min))
return answer
일단 제 코드인데요...
일단 문제는 이해했지만 코드로 어떻게 써야 할지 정말 정말 모르겠습니다.
이리저리 바꿔봐도 아무래도 안될 것 같아서 도움을 요청했습니다.
chat GPT 답변
def solution(a, b, c, d):
dice = sorted([a, b, c, d])
# 네 주사위 수가 모두 같은 경우
if dice[0] == dice[3]:
return 1111 * dice[0]
# 세 주사위 중 두 개가 같은 경우
if (dice[0] == dice[2]) or (dice[1] == dice[3]):
if dice[0] == dice[2]:
p = dice[0]
q = dice[3]
else:
p = dice[1]
q = dice[2]
return (10 * p + q) ** 2
# 주사위가 두 개씩 같은 값이 나오는 경우
if (dice[0] == dice[1]) and (dice[2] == dice[3]):
p = dice[0]
q = dice[2]
return (p + q) * abs(p - q)
# 어느 두 주사위에서 나온 숫자가 같고, 다른 주사위에서도 각각 다른 숫자가 나오는 경우
if ((dice[0] == dice[1]) and (dice[2] != dice[3])) or ((dice[0] != dice[1]) and (dice[2] == dice[3])):
q = min(dice[0], dice[1])
r = max(dice[2], dice[3])
return q * r
# 네 주사위 모두 다른 숫자가 나온 경우
return min(dice)
친절하게 알려줬는데 충격적 이게도
5개 중에 3개만 맞았습니다.
그리고 계속 문제를 알려주고 수정해 봐도 이해가 안 되는지 5개 모두 맞추지 못했습니다.
이리저리 gpt와 얘기하던 중 결국 포기하고 다른 분의 풀이를 봤습니다.
def solution(a, b, c, d):
nums = {a, b, c, d}
if len(nums) == 4:
return min(nums)
count = {}
for num in (a, b, c, d):
count[num] = count.get(num, 0) + 1
if len(nums) == 1:
return nums.pop() * 1111
elif len(nums) == 2:
if 3 in count.values():
p = [k for k, v in count.items() if v == 3][0]
q = [k for k in nums if k != p][0]
return (10 * p + q) ** 2
else:
p, q = count.keys()
return (p + q) * abs(p - q)
else:
p = [k for k, v in count.items() if v == 2][0]
q, r = [k for k in nums if k != p]
return q * r
정답 풀이입니다.
- solution 함수는 네 개의 인자(a, b, c, d)를 받습니다.
- nums 집합(set)은 입력된 네 개의 숫자를 중복을 제거하고 저장합니다. 이렇게 하면 중복된 숫자가 제거되고 유니크한 숫자만 남게 됩니다.
- if len(nums) == 4:: 만약 nums의 길이가 4라면, 즉 네 개의 숫자가 모두 서로 다른 숫자라면, 그중에서 가장 작은 숫자를 반환합니다.
- count 딕셔너리는 입력된 숫자들의 개수를 저장합니다. 각 숫자가 몇 번 나왔는지를 기록합니다.
- if len(nums) == 1:: 만약 nums의 길이가 1이라면, 즉 입력된 숫자가 모두 동일한 숫자라면, 그 숫자를 1111로 곱한 값을 반환합니다.
- elif len(nums) == 2:: 만약 nums의 길이가 2라면, 즉 입력된 숫자 중에서 두 개의 숫자가 동일한 숫자라면, 다음을 확인합니다.
- 만약 어떤 숫자가 3번 나왔다면, p 변수에 그 숫자를 할당하고 나머지 하나의 숫자를 q 변수에 할당합니다. 그런 다음, (10 * p + q) ** 2를 계산하여 반환합니다.
- 그렇지 않다면, 입력된 두 숫자를 p와 q 변수에 할당하고, (p + q) * abs(p - q)를 계산하여 반환합니다.
- 위의 모든 조건을 만족하지 않는 경우에는, p 변수에 두 번 나온 숫자를 할당하고, 나머지 두 숫자를 q와 r 변수에 할당합니다. 그런 다음, q * r를 계산하여 반환합니다.
정말... 0단계인데도 너무너무 어려웠습니다.
이거 0단계 맞나요..?
여러 개 풀어보려고 했는데 예상치 못하게 이 문제에서 막혀서 내일 더 많이 풀겠습니다.
'오늘부터 코딩테스트' 카테고리의 다른 글
[오늘부터 코딩테스트]프로그래머스 코딩 기초 프로그램 풀기 (0) | 2023.09.26 |
---|---|
[오늘부터 코딩테스트]프로그래머스 코딩 기초 프로그램 풀기 (0) | 2023.09.23 |
[오늘부터 코딩테스트]프로그래머스 코딩 기초 프로그램 풀기 (0) | 2023.09.21 |
[오늘부터 코딩테스트]프로그래머스 코딩 기초 프로그램 풀기 (0) | 2023.09.19 |
[오늘부터 코딩테스트]프로그래머스 코딩 기초 프로그램 풀기 (0) | 2023.09.18 |