-
2480번 : 주사위 세개알고리즘 공부/백준 Python 코딩테스트 2021. 10. 13. 11:06
[ 문제 ]
1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.
- 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.
- 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
- 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×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개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.
[ Input ]
첫째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다.
[ Output ]
첫째 줄에 게임의 상금을 출력 한다.
[ 풀이1 ]
이번엔 풀이가 3개다. 첫번째 풀이는 정말 직관적으로 풀었다.
우선 주사위의 값을 list로 받고 이 값을 set로 변환하면 주사위의 눈이 모두 같으면 set의 길이가 1, 2개만 같으면 2, 모두 다 다르면 3이다. 이 점을 활용한다.
길이가 3이라면 주사위의 눈이 모두 다르므로 가장 큰 값을 가져와서 계산한다.
길이가 2이라면 눈이 2개만 같으므로 같은 값을 찾아야한다. set에 있는 값들을 가져와서 list에서 count했을 때 2인 값을 same_dice 변수에 저장하고 이 값으로 계산한다.
나머지는 길이가 1인 경우 이므로 주사위의 눈이 모두 같다. list의 값 중 아무거나 가져와 계산하면된다.
이렇게 풀고나니 코드가 너무 지저분했다. 주사위 눈이 2개만 같을 때의 코드를 이렇게 해야한다고? 후움.. 하고 고민하다가 생각한게 풀이2 이다.
[ 코드1 ]
# 주사위 input dice_list = list(map(int, input().split())) # list를 set 화 dice_set = set(dice_list) # 주사위 눈이 모두 다를 때 if len(dice_set) == 3: print(max(dice_set) * 100) # 주사위 눈이 2개만 같을 때 elif len(dice_set) == 2: same_dice = 0 for i in dice_set: if dice_list.count(i) == 2: same_dice = i print(1000 + same_dice*100) # 주사위 눈이 모두 같을 때 else: print(10000 + dice_list[0] * 1000)
[ 풀이2 ]
풀이1과 많은 차이가 있지 않다고 생각했는데 많이 다른 것 같기도하고...
list로 받고 set 변환하는것 똑같지만 list를 우선 정렬 했다. list 정렬하는 방법은 list.sort()와 sorted(list)가 있는데 sorted는 변환한 값을 print해주지만 list.sort는 원본을 정렬해준다. 원하는 방식으로 사용할 것!
list 정렬을 해준다면 주사위 눈이 2개만 같을 때 가운데에 있는 숫자가 중복된 숫자임을 이용한다.
위의 풀이1보다 더 빠르게 계산되었다.(백준에서 비교했을 때!)
[ 코드2 ]
# 주사위 input dice_list = list(map(int, input().split())) # list 정렬 dice_list = sorted(dice_list) # dice_list.sort() 같아영 # list를 set 화 dice_set = set(dice_list) # 주사위 눈이 모두 같을 때 if len(dice_set) == 3: print(max(dice_set) * 100) # 주사위 눈이 모두 다를 때 elif len(dice_set) == 1: print(10000 + dice_list[0] * 1000) # 주사위 눈이 2개만 같을 때 else: print(1000 + dice_list[1] * 100)
[ 풀이3 ]
이번엔 3개의 숫자를 각각 받아서 다 따로따로 계산했다. 별도의 설명은 필요없을 것이라고 생각해서 pass
참고로 이 코드가 위의 2개의 코드보다 실행 시간이 더 길다.
[ 코드3 ]
# 주사위 input a, b, c = list(map(int, input().split())) # 주사위 눈이 모두 같을 때 if a == b == c: print(10000 + a * 1000) # 주사위 눈이 2개만 같을 때 elif a == b: print(1000 + a * 100) elif b == c: print(1000 + b * 100) elif c == a: print(1000 + c * 100) # 주사위 눈이 모두 다를 때 else: print(max([a, b, c])* 100)
'알고리즘 공부 > 백준 Python 코딩테스트' 카테고리의 다른 글
2476번 : 주사위 게임 (0) 2021.10.14 3009번 : 네 번째 점 (0) 2021.10.13 1934번 : 최소공배수 (0) 2021.10.13 10039번 : 평균 점수 (0) 2021.10.12 2753번 : 윤년 (0) 2021.10.12