문제
1에서부터 6까지의 눈을 가진 4개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.
- 같은 눈이 4개가 나오면 50,000원+(같은 눈)×5,000원의 상금을 받게 된다.
- 같은 눈이 3개만 나오면 10,000원+(3개가 나온 눈)×1,000원의 상금을 받게 된다.
- 같은 눈이 2개씩 두 쌍이 나오는 경우에는 2,000원+(2개가 나온 눈)×500원+(또 다른 2개가 나온 눈)×500원의 상금을 받게 된다.
- 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
- 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.
예를 들어, 4개의 눈이 3, 3, 3, 3으로 주어지면 50,000+3×5,000으로 계산되어 65,000원의 상금을 받게 된다. 4개의 눈이 3, 3, 6, 3으로 주어지면 상금은 10,000+3×1,000으로 계산되어 13,000원을 받게 된다. 또 4개의 눈이 2, 2, 6, 6으로 주어지면 2,000+2×500+6×500으로 계산되어 6,000원을 받게 된다. 4개의 눈이 6, 2, 1, 6으로 주어지면 1,000+6×100으로 계산되어 1,600원을 받게 된다. 4개의 눈이 6, 2, 1, 5로 주어지면 그 중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.
N(1 ≤ N ≤ 1,000)명이 주사위 게임에 참여하였을 때, 가장 많은 상금을 받은 사람의 상금을 출력하는 프로그램을 작성하시오.
조건 및 입출력
1. 첫째 줄에는 참여하는 사람 수 N이 주어지고 그 다음 줄부터 N개의 줄에 사람들이 주사위를 던진 4개의 눈이 빈칸을 사이에 두고 각각 주어진다.
2. 첫째 줄에 가장 많은 상금을 받은 사람의 상금을 출력한다.
코드 (Python3)
# 입력부
trys=int(input()); #시행 횟수 저장 변수
# 처리부
price=0; #상금 값 저장 변수
result=0; #상금 중 최댓값 저장 변수
for i in range(trys):
dice=list(map(int,input().split()));
for j in range(1,7): #주사위 면은 1부터 6까지 있으므로
if(dice.count(j)==4): #같은 면 4개 나온 경우
price=50000+j*5000;
break;
elif(dice.count(j)==3): #같은 면 3개 나온 경우
price=10000+j*1000;
break;
elif(dice.count(j)==2):
for k in range(j+1,7+1): #같은 면이 2개, 2개 나온지 판별
if(dice.count(k)==2): # 6도 판별해야 함. 범위가 (7,7)이면 루프가 한번도 돌지 않음.
price=2000+500*(j+k);
break;
else:
price=1000+100*j;
break;
else:
price=max(dice)*100; #전부 다른 면이 나온 경우
if(result<price): #최댓값 판별
result=price;
# 출력부
print(result);
풀이 과정
처음 게임에 참가하는 사람 수를 입력받는다. 그 후 입력받은 수 만큼 루프를 돌린다.
게임에 참가하는 인원이 주사위를 4번 던져서 나온 면을 입력받아 리스트에 저장한다.
주사위는 1부터 6까지의 면이 존재하므로, 1부터 6까지 루프를 돌려 주사위의 면이 몇 개인지 확인한다. -> range(1,7)
4개이면, 50,000원+(같은 눈)×5,000원의 상금을 받을 수 있게 코드를 작성하고,
3개이면 10,000원+(3개가 나온 눈)×1,000원 의 코드를 작성한다.
조심해야 할 부분이 바로 2개를 받는 경우이다.
2개인 경우는 [a,a,b,c] 또는 [a,a,b,b] 가 나올 수 있다. (등장 순서 고려하지 않음)
따라서, if문을 통해 만약 1부터 6중에 2개 이상의 요소 N이 있는지 판별한다. ->range(1,7)
이후 N+1번부터 6번까지 또 다시 2개가 등장하는지 판별하면 된다. ->range(N+1,7) //여긴 오류가 있다. (나중에 뒤에서 오류를 수정할 것이다.)
만약 2개가 또 등장한다면 2,000원+(2개가 나온 눈)×500원+(또 다른 2개가 나온 눈)×500원의 상금을 받을 수 있게 코드를 작성하면 되고, 그렇지 않다면 1,000원+(같은 눈)×100원의 상금을 받을 수 있게 한다.
그러나 생각해야 할 점이 있다.
N+1번부터 6번까지 또 다시 2개가 등장하는지 판별하는 과정에서, 6이 2번 등장하고 나머지는 전부 다른 면이 있는 경우를 생각을 해 주어야 한다. -> range(N+1,7)
만약 주사위를 던졌을 때 6이 두 번 등장했다고 생각해보자. 예) [a,b,6,6] (순서 고려 하지 않음)
그럼 지금까지 본 range의 범위를 살려보자. 그렇다면 N+1부터 6번까지의 루프 전체는 루프를 돌지 않는다는 것을 알 수 있다. ->range(N+1,7) -> (6이 있는 경우) -> range(7,7)이다.
고로, 종료지점도 +1을 해 주어야 한다. ->range(N+1,7+1) -> (6이 있는 경우) -> range(7,8)
그래야 주사위 똑같은 주사위 면이 2개만 있을 때의 경우를 실행하기 때문이다.
(주사위의 면이 7인 경우는 없으므로, 자동으로 [a,a,b,c]인 경우를 연산한다.)
이 조건을 잘 구현했다면,
그 후 나머지 조건인, 모두 다른 경우를 (그 중 가장 큰 눈)×100원을 작성하면 된다.
모든 조건 작성이 끝났다면, 게임에 참가하는 선수들의 점수를 비교해가며, 최댓값을 찾은 뒤 정답을 출력하면 된다.
여담
루프 범위를 잘못 잡아, 디버깅 하는데 몇 시간을 날렸다.
처음 문제를 봤을 땐, 금방 풀줄 알았는데, 디버깅 하는데 한참 걸렸다.
토익 공부하다 살짝 몽롱해서, 정신 좀 차릴 겸 풀었던 문젠데... 너무 오래 걸렸다.
[6,6,a,b]에서 자꾸 결과가 이상하게 나와서 한참 고민했다.
결국 하나씩 코드를 뜯어본 결과 for문에서 (시작,종료)값이 일치하다는 걸 깨닫고, 종료값에 +1을 해 주었더니 통과했다...
왜 이걸 생각 못했을까 싶다가도, 이런걸 지금에서 깨달았으니 다행이다.
| 코드가 이상하거나, 이해되지 않는 부분이 있다면 언제든 댓글 남겨주세요! + 더 좋은 풀이 방법이 있다면 알려주세요! :) |
'Programming > Python' 카테고리의 다른 글
| [백준] 2789번 : 유학 금지 (Python / 파이썬) (2) | 2023.01.24 |
|---|---|
| [백준] 2566번 : 최댓값 (Python / 파이썬) (0) | 2023.01.24 |
| [백준] 2309번 : 일곱 난쟁이 (Python / 파이썬) (0) | 2023.01.19 |
| [백준] 1747번 : 소수&팰린드롬 (Python / 파이썬) (0) | 2023.01.18 |
| [백준] 11051번 : 이항 계수 2 (Python / 파이썬) (0) | 2023.01.17 |