프로그래머스/Level_0

[프로그래머스] Lv.0 - 주사위 게임 3.py

ro-jun 2024. 10. 6. 01:13
728x90
반응형

문제

  • 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 이하의 정수입니다.

입출력 예

입출력 설명

  • 입출력 예 1
    • 예제 1번에서 네 주사위 숫자가 모두 2로 같으므로 1111 × 2 = 2222점을 얻습니다. 따라서 2222를 return 합니다.
  • 입출력 예 2
    • 예제 2번에서 세 주사위에서 나온 숫자가 4로 같고 나머지 다른 주사위에서 나온 숫자가 1이므로 (10 × 4 + 1)2 = 412 = 1681점을 얻습니다. 따라서 1681을 return 합니다.
  • 입출력 예 3
    • 예제 3번에서 a, d는 6으로, b, c는 3으로 각각 같으므로 (6 + 3) × |6 - 3| = 9 × 3 = 27점을 얻습니다. 따라서 27을 return 합니다.
  • 입출력 예 4
    • 예제 4번에서 두 주사위에서 2가 나오고 나머지 다른 두 주사위에서 각각 5, 6이 나왔으므로 5 × 6 = 30점을 얻습니다. 따라서 30을 return 합니다.
  • 입출력 예 5
    • 예제 5번에서 네 주사위 숫자가 모두 다르고 나온 숫자 중 가장 작은 숫자가 2이므로 2점을 얻습니다. 따라서 2를 return 합니다.

코드 1

from collections import Counter

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

    score_list = [a, b, c, d]
    counts = Counter(score_list)
    most_value = counts.most_common(2)[0][0]
    most_count = counts.most_common(2)[0][1]

    set_score = list(set(score_list))
    if len(set_score) == 1:
        answer = 1111 * set_score[0]
    elif len(set_score) == 4:
        answer = min(set_score)
    elif len(set_score) == 2:
        if most_count == 2:
            answer = (set_score[0] + set_score[1]) * abs(set_score[0] - set_score[1])
        else:
            answer = (10 * most_value + counts.most_common(2)[1][0]) ** 2
    else:
        answer = a * b * c * d / counts.most_common(1)[0][0] / counts.most_common(1)[0][0]
    return answer

코드 2

def solution(a, b, c, d):
    answer = 0
    score_list = sorted([a, b, c, d])
    score_set = set(score_list)
    if len(score_set) == 1:
        answer = 1111 * score_list[0]
    elif len(score_set) == 4:
        answer = score_list[0]
    elif len(score_set) == 2:
        if score_list.count(score_list[0]) == 2:
            answer = (score_list[0] + score_list[-1]) * abs(score_list[0] - score_list[-1])
        else:    
            if score_list[0] == score_list[1]:
                answer = (10 * score_list[0] + score_list[-1]) ** 2
            elif score_list[2] == score_list[3]:
                answer = (10 * score_list[-1] + score_list[0]) ** 2
    elif len(score_set) == 3:
        if score_list[0] == score_list[1]:
                answer = score_list[2] * score_list[3]
        elif score_list[1] == score_list[2]:
                answer = score_list[0] * score_list[3]
        elif score_list[2] == score_list[3]:
                answer = score_list[0] * score_list[1]
    return answer

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

728x90
반응형