Dev_from the Bottom

#20. Algorithm16_python) 주사위 세 개_백준 2480 본문

Algorithm_study

#20. Algorithm16_python) 주사위 세 개_백준 2480

고무라면 2022. 5. 24. 20:54

문제) 주사위 세 개

  • 1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다. 
1. 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다. 
2. 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다. 
3. 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.
 
  •  예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3×100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000+2×1,000 으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.
  • 3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.

입력)

  • 첫째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다. 

출력)

  • 첫째 줄에 게임의 상금을 출력한다.


step1) 시도1 : 실패

n1, n2, n3 = map(int, input().split())

if n1 == n2 == n3:
    # print(n1)
    price = 10000 + n1 * 1000
elif n1 == n2 or n2 == n3 or n3 == n1:
    # print(n2)
    price = 1000 + n2 * 100
else:
    # print(n3)
    price = n3 * 100

- 조건은 나누었지만, elif 절에서 같은 값을, else 절에서 최댓값을 추출해야 함

 

step2) 시도2 : 성공

n1, n2, n3 = map(int, input().split())

list = [n1, n2, n3]

if n1 == n2 == n3:
    price = 10000 + n1 * 1000

elif n1 == n2 or n2 == n3 or n3 == n1:
    if n1 == n2:
        price = 1000 + n1 * 100
    elif n2 == n3:
        price = 1000 + n2 * 100
    else:
        price = 1000 + n3 * 100

else:
    max = n1
    for i in list:
        if max < i:
            max = i
    # print(max)
    price = max * 100

print(price)

>>>
6 2 5
600

- 정답은 맞혔지만, 코드가 너무 장황함 : 특히 elif 절 안에, if + elif +elif 절이 포함되어 있는 부분

 


 

다른 방법_case1) 두 개의 수가 같은 경우를 두 가지로 나눔

n1, n2, n3 = map(int,input().split())
if n1 == n2 == n3:
    print(10000 + n1 *1000)
elif  n1 == n2 or n2 == n3:
    print(1000 + n2 * 100)
elif n1 == n3:
    print(1000 + n1 * 100)
else:
    print(max(n1, n2, n3) * 100)

다른 방법_case2) : 리스트 활용

temp=input().split(" ")      # 값을 받아옴(문자열)
list=[]
for i in temp:
    list.append(int(i))      # 정수형으로 바꿔서 list라는 배열에 넣음
list.sort()                  # 리스트 정렬
list_s = set(list)           # 리스트를 집합화 시켜주고 list_s에 넣어줌

if len(list_s)==1 :          # 모두 같은눈이 나왔을 때
    print(10000+list[0]*100)
elif len(list_s)==3 :        # 모두 다른눈이 나왔을 때
    print(list[-1]*100)
else :                       # 2개가 같은눈이 나왔을 때
    print(1000+list[1]*100)  # 총 3개의 원소 중 정렬을 했을 때 중간이 같은수

다른 방법_case3) 리스트 활용2

n1, n2, n3 = map(int, input().split())

list = [n1, n2, n3]

list.sort()
# print(list)

set1 = set(list)
# print(set)

if len(set1) == 1:
    print(10000 + list[0] * 1000)
elif len(set1) == 3:
    print(list[-1] * 100)
else:
    print(1000 + list[1] * 100)

  • 그러나 딱히 메모리나 시간에 차이가 없음!ㅜㅠ

 


# 배운 점

  • 조건문을 더욱 세심하게
  • 리스트를 효과적으로 사용
  • 메모리 할당과 실행 시간에 대한 고민

 

# 소회

  • 여러 가지 방법을 고안해봤으나, 딱히 메모리나 실행 시간이 달라지지 않음
  • 연산 자체가 별로 없어서 그렇겠지만, 이 문제를 어떤 방식으로 접근해야 할지 감이 잡히지는 않음

 

Comments