Fullstacknology 2023. 5. 24. 04:54

콜라츠 추측(짝수면 / 2  홀수면 3n + 1로 최종값은 결국 1이 됨)

"""
입출력 예
n	result
10	[10, 5, 16, 8, 4, 2, 1]
"""

def solution(n):
    answer = [n]
    while n != 1:
        if n % 2 == 0:
            n = n // 2
        else:
            n = 3 * n + 1
        answer.append(n)
    return answer

 

주사위 문제 (총 4개의 주사위를 굴려서 값이 4개 혹은 3개 혹은 2개씩 같은 경우)

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]:
            return (10 * dice[0] + dice[3]) ** 2
        else:
            return (10 * dice[3] + dice[0]) ** 2

    # 두 개의 주사위가 동일한 숫자를 가지는 경우
    if dice[0] == dice[1] and dice[2] == dice[3]:
        return (dice[0] + dice[3]) * abs(dice[0] - dice[3])

    # 두 주사위가 같고 나머지 두 주사위는 각각 다른 숫자가 나온경우
    if dice[0] == dice[1] != dice[2] != dice[3]:
        return dice[2] * dice[3]

    if dice[0] != dice[3]:
        return dice[0]


# 위의 코드는 테스트 케이스를 통과 못함


# 아래의 코드는 참고 테스트 케이스 통과 x
def solution(a, b, c, d):
    dice = [a, b, c, d]  # 주사위 숫자를 리스트로 저장합니다.
    dice_set = set(dice)  # 주사위 숫자의 집합을 구합니다.

    if len(dice_set) == 1:
        # 모든 주사위의 숫자가 동일한 경우
        # set은 중복을 허용하지 않기 때문에 같은 숫자가 4개라면 오직 1개만 남는다.
        return 1111 * a
    elif len(dice_set) == 2:
        if dice.count(a) == 3 or dice.count(b) == 3:
            # 세 개의 주사위의 숫자가 같고, 나머지 하나의 숫자가 다른 경우
            return (10 * a + b) ** 2
        else:
            # 두 개의 주사위의 숫자가 같고, 나머지 두 개의 숫자가 다른 경우
            p = dice[0]  # 두 개의 숫자 중 하나를 선택합니다.
            q = dice[2]  # 다른 하나의 숫자를 선택합니다.
            return (p + q) * abs(p - q)
    elif len(dice_set) == 3:
        # 어떤 두 개의 주사위의 숫자가 같고, 다른 두 개의 숫자가 다른 경우
        p = dice[0]  # 두 개의 숫자 중 하나를 선택합니다.
        q = dice[1] if dice.count(dice[1]) == 2 else dice[3]  # 다른 하나의 숫자를 선택합니다.
        return q * dice[dice.index(dice_set.difference({p, q}).pop())]
    else:
        # 네 개의 주사위의 숫자가 모두 다른 경우
        return min(dice)


# 아래의 코드가 모범답안
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)