프로그래머스 파이썬 기초 해석 :: 주사위 게임 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문에 ③ 다 같을때를 넣으면, 아래처럼 같이 다 같은 경우에 결과값이 틀리게 나온다. 


그 이유는, elif문에 ③ 다 같을때를 넣더라도 if문에 있는 ② 2개의 값이 맞을때에서 실행이 되기 때문이다.

그래서, 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       



------------------------


느낀점

다시 한번 풀어보쟈. 







댓글

이 블로그의 인기 게시물

[KT 에이블스쿨 - IT 트랜드] 국내외 AI 관련 규제

KT 에이블스쿨 : 핀테크 아이디어 공모전

KT 에이블스쿨 : 6-7차 미니프로젝트 - 제안서 기반 솔류션 기획 및 설계