인프런 커뮤니티 질문&답변

강채희님의 프로필 이미지

작성한 질문수

파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)

9. 주사위 게임

주사위게임(5분경)에서 질문드립니다.

20.07.16 00:14 작성

·

180

2

저는 a,b,c정렬이 오름차순으로 이미 정렬되어있기에 두수가 같은 경우를 예를들면

2 2 5 이거나 3 5 5 식이 된다고 생각하고  a==b and b==c라는 if 문 보다는 a==b or b==c라는 if문을 통해  같은눈이 두개 나올때를가정했는데 이렇게 이해해도 괜찮을까요?

제가 이해한 바로는 a==c이면 가장 작은값인 a와 가장 큰값인 c가 값이 같아 결국 b도 값이 같아진다고 이해했습니다.

답변 3

0

김태원님의 프로필 이미지
김태원
지식공유자

2020. 09. 21. 15:27

안녕하세요^^

 break를 하고 싶다면 신호변수를 하나 두면 됩니다. 그리고 j인덱스값과 k인덱스 값이 같으면 arr[j]와 arr[k]가 같은 값을 가르키며 하나의 값을 가지고 서로 다른 두 개가 같은 것처럼 판단합니다 그래서 j값과 k값은 같은 값이 되게 반복하면 안됩니다.

아래 코드는 같은 눈이 2개일때인 elif문을 수정해보았습니다. 100점 나옵니다.

N = int(input())
dice = [list(map(int, input().split())) for _ in range(N)] #주사위수 2차원 배열
max_total = [] #상금 모아놓은 배열
for i in range(len(dice)):
    arr = dice[i]
    max_num = 0
    total = 0

    if  len(set(arr)) == 1: #주사위눈이 다같을때
        max_num = max(arr)
        total = 10000+(max_num)*1000
        max_total.append(total)
    elif len(set(arr)) == 2: #2개만 같을떄
        flag=False #신호변수 선언
        for j in range(len(arr)-1): #j값은 0과 1만 인덱스해도 됩니다
            for k in range(j+1, len(arr)): #k값은 j값과 같은 값을 가지면 안되므로 j+1로 시작해야 합니다.
                if arr[j] == arr[k]:
                    tmp = arr[j]
                    flag=True
            if flag: break
        total = 1000 + tmp * 100
        max_total.append(total)

    else: #다다를때
        max_num = max(arr)
        total = 1000 + (max_num) * 100
        max_total.append(total)

result = max(max_total)
print(result)

0

프린이님의 프로필 이미지

2020. 09. 19. 17:14

안녕하세요 강좌듣고 있는 학생입니다! 제가 구현한 코드 2번 테스트케이스가 에러뜨는데 한번 봐주실수 있을까요?

elif문이 문제인것 같은데 tmp에 값이 들어오면 멈추게 하고싶은데 for j 문이랑 나란하게 쓰니까 result = max(max_total) 에서 에러나고 (왜에러날까요?), for k문이랑 나란하게 쓰니까 2번 케이스에만 오류납니다. tmp 값들어오면  elif문안에 for문 멈추게 하는 방법없나요?ㅠㅠ 

N = int(input())
dice = [list(map(int, input().split())) for _ in range(N)] #주사위수 2차원 배열
max_total = [] #상금 모아놓은 배열
for i in range(len(dice)):
arr = dice[i]
max_num = 0
total = 0

if len(set(arr)) == 1: #주사위눈이 다같을때
max_num = max(arr)
total = 10000+(max_num)*1000
max_total.append(total)
elif len(set(arr)) == 2: #2개만 같을떄
for j in range(len(arr)):
for k in range(1, len(arr)):
if arr[j] == arr[k]:
tmp = arr[j]
break
total = 1000 + tmp * 100
max_total.append(total)

else: #다다를때
max_num = max(arr)
total = 1000 + (max_num) * 100
max_total.append(total)

result = max(max_total)
print(result)

0

김태원님의 프로필 이미지
김태원
지식공유자

2020. 07. 16. 08:32

안녕하세요^^

기존 코드에서 a==b and b==c 조건은 3개의 수가 모두 같다는 조건으로 사용한 것입니다.  

강채희님의 코드를 올려주시면 좀더 정확하게 무엇을 질문한 것인지 알 수 있을 것 같습니다.  강채희님의 질문내용과 의견을 이해한대로 적용해본 코드입니다.  님의 의견처럼 정렬한 것을 최대한 활용해서 아래 코드처럼 짜면 기존코드보다 더 좋은 코드가 되는 것 같습니다. 좋은 의견 감사합니다^^

max=0
res=0
n=int(input())
for i in range(n):
    tmp=input().split() 
    tmp.sort() 
    a, b, c=map(int, tmp)
    if a==c:  # 3개의 값이 모두 같은 경우
        money=10000+(a*1000);
    elif a==b or b==c: # 2개의 수가 같은 경우 
        money=1000+(b*100)
    else:
        money=c*100
    if money > res:
        res=money

print(res)