문제

1에서부터 6까지의 눈을 가진 4개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.

  1. 같은 눈이 4개가 나오면 50,000원+(같은 눈)×5,000원의 상금을 받게 된다. 
  2. 같은 눈이 3개만 나오면 10,000원+(3개가 나온 눈)×1,000원의 상금을 받게 된다. 
  3. 같은 눈이 2개씩 두 쌍이 나오는 경우에는 2,000원+(2개가 나온 눈)×500원+(또 다른 2개가 나온 눈)×500원의 상금을 받게 된다.
  4. 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다. 
  5. 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×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을 해 주었더니 통과했다...

 

왜 이걸 생각 못했을까 싶다가도, 이런걸 지금에서 깨달았으니 다행이다.

 

 

코드가 이상하거나, 이해되지 않는 부분이 있다면 언제든 댓글 남겨주세요!

+ 더 좋은 풀이 방법이 있다면 알려주세요! :)

+ Recent posts