본문 바로가기
  • 머킹이의 머신로그
오늘부터 코딩테스트

[오늘부터 코딩테스트]프로그래머스 코딩 기초 프로그램 풀기

by 머킹 2023. 9. 20.
728x90

프로그래머스 주사위 게임 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

정답 풀이입니다.

  1. solution 함수는 네 개의 인자(a, b, c, d)를 받습니다.
  2. nums 집합(set)은 입력된 네 개의 숫자를 중복을 제거하고 저장합니다. 이렇게 하면 중복된 숫자가 제거되고 유니크한 숫자만 남게 됩니다.
  3. if len(nums) == 4:: 만약 nums의 길이가 4라면, 즉 네 개의 숫자가 모두 서로 다른 숫자라면, 그중에서 가장 작은 숫자를 반환합니다.
  4. count 딕셔너리는 입력된 숫자들의 개수를 저장합니다. 각 숫자가 몇 번 나왔는지를 기록합니다.
  5. if len(nums) == 1:: 만약 nums의 길이가 1이라면, 즉 입력된 숫자가 모두 동일한 숫자라면, 그 숫자를 1111로 곱한 값을 반환합니다.
  6. elif len(nums) == 2:: 만약 nums의 길이가 2라면, 즉 입력된 숫자 중에서 두 개의 숫자가 동일한 숫자라면, 다음을 확인합니다.
    • 만약 어떤 숫자가 3번 나왔다면, p 변수에 그 숫자를 할당하고 나머지 하나의 숫자를 q 변수에 할당합니다. 그런 다음, (10 * p + q) ** 2를 계산하여 반환합니다.
    • 그렇지 않다면, 입력된 두 숫자를 p와 q 변수에 할당하고, (p + q) * abs(p - q)를 계산하여 반환합니다.
  7. 위의 모든 조건을 만족하지 않는 경우에는, p 변수에 두 번 나온 숫자를 할당하고, 나머지 두 숫자를 q와 r 변수에 할당합니다. 그런 다음, q * r를 계산하여 반환합니다.

정말... 0단계인데도 너무너무 어려웠습니다.

이거 0단계 맞나요..?

여러 개 풀어보려고 했는데 예상치 못하게 이 문제에서 막혀서 내일 더 많이 풀겠습니다.