주사위 세개
문제는 다음과 같습니다.
문제를 요약하자면, 주사위를 던져서 조건 1,2,3에 해당할 경우 상금을 받는 게임을 작성하는 것 입니다.
이 문제를 쉽게 풀기 위해 set() 개념에 대해 한번 설명하겠습니다.
1. Set의 기본 개념
Set은 파이썬의 기본 자료구조 중 하나로, 다음과 같은 특징을 가집니다:
- 중복을 허용하지 않는 자료구조
- 순서가 없는(unordered) 컬렉션
- 수정 가능(mutable)한 자료구조
- 수학의 집합 개념을 구현한 자료형
2. Set 생성 방법
# 빈 set 생성
empty_set = set()
# 값이 있는 set 생성
my_set = {1, 2, 3, 4, 5}
# 리스트나 튜플로부터 set 생성
from_list = set([1, 2, 2, 3, 3]) # 결과: {1, 2, 3}
from_string = set("hello") # 결과: {'h', 'e', 'l', 'o'}
먼저 set 없이 조건문을 이용해서만 해답한 코드입니다.
if a == b == c:
print(10000 + a * 1000)
elif a == b or b == c or a == c:
if a == b:
print(1000 + a * 100)
elif b == c:
print(1000 + b * 100)
else:
print(1000 + a * 100)
else:
print(max(a,b,c) * 100)
이도 매우 간단하지만, 만약 코드가 길어지거나 변수가 많아지면 분명 코드의 가독성이 떨어질 것이며 코딩도 힘들어 질 것입니다.
다음은 set() 활용한 코드입니다.
a, b, c = map(int, input().split())
dice = [a, b, c]
dice_set = set(dice)
if len(dice_set) == 1: # 세 개의 눈이 모두 같은 경우
print(10000 + a * 1000)
elif len(dice_set) == 2: # 두 개의 눈이 같은 경우
for i in dice:
if dice.count(i) == 2: # 2개가 같은 숫자 찾기
print(1000 + i * 100)
break
else: # 모두 다른 경우
print(max(dice) * 100)
이전 코드와 달리 유동성이 매우 커 막대한 크기의 변수가 와도 크게 가독성도 떨어지지 않고 코딩도 보다 쉽게 할 수 있습니다.
앞으로 이 set()를 활용하여 실제로도 많이 사용하므로 그 사용법을 익히는 것이 중요하다고 생각합니다.
하지만 막상 다른 사람의 공개된 오답 코드를 확인 해 보니 논리는 다 맞지만 단순하게 상금을 계산하는데 있어 실수로 인해 틀린 사람이 많다고 생각합니다. 물론 이 의견이 일반화되는 것은 아니지만 제가 분석하기로는 모두 중복 처리에 있어서 list() 혹은 브루트포스 방식, set() 방식으로 처리 했지만 상금 계산에 있어 실수로 하여 틀린 코드가 대다수 였습니다.
다음은 공개된 다른 사람의 오답 코드입니다.
마지막 else 부분에서 오류가 있습니다.
문제의 규칙 3번을 보면: "모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다."
따라서 단순하게 100을 곱하지 않아 틀렸습니다. 이와 같은 코드가 대다수였습니다.
'BaekJoon Reivew' 카테고리의 다른 글
단계별로 풀어보기 백준_10950번 (0) | 2025.02.06 |
---|---|
단계별로 풀어보기 백준_2739번 (0) | 2025.02.06 |
단계별로 풀어보기 백준_2525번 (0) | 2025.02.05 |
단계별로 풀어보기 백준_2884번 (0) | 2025.02.05 |
단계별로 풀어보기 백준_14681번 (0) | 2025.02.05 |