프로그래머스 파이썬 기초 해석 :: 주사위 게임 2 (set)
프로그래머스 URL
https://school.programmers.co.kr/learn/courses/30/lessons/181930
프로그래머스 코딩 카테고리
코딩 기초 트레이닝
Day 5 조건문 - 주사위 게임 2
Lv.0
문제 설명
1부터 6까지 숫자가 적힌 주사위가 세 개 있습니다. 세 주사위를 굴렸을 때 나온 숫자를 각각 a, b, c라고 했을 때 얻는 점수는 다음과 같습니다.
세 숫자가 모두 다르다면 a + b + c 점을 얻습니다.
세 숫자 중 어느 두 숫자는 같고 나머지 다른 숫자는 다르다면 (a + b + c) × (a2 + b2 + c2 )점을 얻습니다.
세 숫자가 모두 같다면 (a + b + c) × (a2 + b2 + c2 ) × (a3 + b3 + c3 )점을 얻습니다.
세 정수 a, b, c가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
제한 사항
a, b, c는 1이상 6이하의 정수입니다.
문제 이해
[입력] a, b, c 정수
[출력] 정수
if문으로 a, b, c 정수의 값이 같은지 판단해서, 사칙연산
※ 주의) if, elif, else 순서가 중요하다. 같은 코드라도 if, elif, else 문 순서가 다르면 값이 다르게 나온다. 더 범위가 넓은 값은 else 쪽으로 두고, 범위가 가장 좁은 쪽을 if 로 둬야한다.
------------------------
내가 푼 풀이
처음 쓴건 아래처럼 일반적인 if문
def solution(a, b, c):
if a==b==c :
answer = (a+b+c)*(a**2 + b**2 + c**2)*(a**3+b**3+c**3)
elif a==b or a==c or b==c :
answer = (a+b+c)*(a**2 + b**2 + c**2)
else :
answer = a+b+c
return answer
문제점
1. if, elif, else문 블럭 순서
코드를 작성하면서, 분명 이게 맞는데,, 왜 결과값이 다르게 나오는지 의문이었다.
문제는 조건의 순서이다.
이 주사위 문제에서는 아래처럼 3개의 조건이 있다.
① 3개의 값이 다 다를때, ② 2개의 값이 맞을때, ③ 3개의 값이 다 같을때
가장 범위가 적은, 확률이 적은 조건은 ③ 다 같을때이고,
가장 범위가 큰, 확률이 큰 조건은 ① 다 다를때이다.
if문에 ② 2개의 값이 맞을때 조건을 넣고,
elif문에 ③ 다 같을때를 넣으면, 아래처럼 같이 다 같은 경우에 결과값이 틀리게 나온다.
그래서, if문에는 가장 범위가 적고, 다른것과 포함이 되지 않는 가장 작은 집합을 넣어야한다.
2. 똑같은 연산이 계속 반복되는 것
(a+b+c)이 실행때마다 반복되고, (a**2 + b**2 + c**2)도 if문과 elif문에서 반복된다.
이런 반복되는 코드를 줄여야지 간결한 코드를 짤 수 있다.
앞으로 계속 연습하고 생각해야할 부분이다.
업그레이드
1. 선언 값을 활용해 중복 줄이기
answer의 값은 주사위의 값이 뭐든 간에 (a+b+c) 은 기본이다.
세 수가 다 다를때는, (a + b + c)
두 수만 같을 때는 (a + b + c) × (a2 + b2 + c2 )
세 수가 다 같을때는 (a + b + c) × (a2 + b2 + c2 ) × (a3 + b3 + c3 )
그래서, 처음에 answer을 선언할때부터 (a+b+c) 로 두는 것이다.
answer = a + b + c
2. if문을 활용해서 중복 줄이기
answer = a + b + c로 선언을 하고,
elif문 없이, 2개의 if문으로 answer *= 2제곱 or 3제곱 값을 실행시키는 코드이다.
코드를 짜면서 헷갈렸던 if, elif의 조건 범위를 잘 활용한 코드같다.
이렇게 짜면, 2제곱을 곱하는 식의 중복을 줄일 수 있다.
def solution(a, b, c):
answer = a+b+c
if a==b or b==c or a==c: answer *= a**2+b**2+c**2
if a==b==c: answer *= a**3+b**3+c**3
return answer
3. set() 활용하기 (집합함수)
3-1. set() 함수란?
목적 : 중복된 값을 제거하고 유일한 값들로 이루어진 집합(set)을 생성하는데 사용됨
상황 : 중복된 값을 제거하거나, 어떤 데이터의 유일한 값들만을 추출할 때
효과 : 중복된 값을 제거하여 유일한 값만을 남긴 집합을 반환
공식 : set 클래스 (일반 iterable을 set 클래스로 바꾸는게, set 함수임)
문법 : 집합명 = set(iterable)
입력값 : iterable
리턴값 : set(집합)을 반환(중복X, 유일한값 모임) {1, 2, 3} 처럼 중괄호로 되어있음.
예시
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = set(numbers)
print(unique_numbers)
#출력 {1, 2, 3, 4, 5}
3-2. set() 함수 활용한 주사위 문제
주사위 값의 확인을 len(set())으로, 몇개가 같은지 체크하는 코드이다.
a==b==c 일때는 3개의 값이
def solution(a, b, c):
check=len(set([a,b,c]))
if check==1:
return 3*a*3*(a**2)*3*(a**3)
elif check==2:
return (a+b+c)*(a**2+b**2+c**2)
else:
return (a+b+c)
위 코드 중에서 이 부분이 이해가 처음에 안됐는데, 이해하고 경이로웠음
if check==1:
return 3*a*3*(a**2)*3*(a**3)
(a+b+c) => 3*a : 세 주사위 값의 합
(a2+b2+c2) => 3*(a**2) : 세 주사위 값의 제곱의 합
(a3+b3+c3) =>3*(a**3) : 세 주사위 값의 세제곱의 합
4. for문 + set ()
이 문제의 최강 코드는 이거인 것 같다.
set()를 활용해서, 같은 값이 몇개인지 확인하고
for문을 돌려서, 수식연산을 중복없이 하는 코드,,
def solution(a, b, c):
list = [a, b, c]
answer = 1
for i in range(4-len(set(list))):
answer *= a**(i+1)+b**(i+1)+c**(i+1)
return answer
------------------------
느낀점
다시 한번 풀어보쟈.
댓글
댓글 쓰기