ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2480번 주사위 세 개
    백준 코딩테스트/조건문 2024. 10. 16. 15:45

    문제

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

    1. 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.
    2. 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
    3. 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.

    예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3×100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000+2×1,000 으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.

    3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.

    입력

    첫째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다.

    출력

    첫째 줄에 게임의 상금을 출력 한다.

    예제 입력 1 복사

    3 3 6
    

    예제 출력 1 복사

    1300
    

    예제 입력 2 복사

    2 2 2
    

    예제 출력 2 복사

    12000
    

    예제 입력 3 복사

    6 2 5
    

    예제 출력 3 복사

    600

     

    num_list = list(map(int, input().split()))
    count_dict = {}
    money = 0

    for num in num_list:
        try: count_dict[num] += 1
        except: count_dict[num]=1

    if len(count_dict) == 1:
        money = 10000 + next(iter(count_dict)) * 1000
    elif len(count_dict) == 2:
        money = 1000 + max(count_dict, key=count_dict.get) * 100
    else:
        money = max(count_dict.keys()) * 100

    print(money)

     

    다음과 같이 하면 해결 할 수 있다.

    - input 값들을 list화하고 여기서 dict을 이용해 같은 값이 있는 지 확인하고 있다면, 그것에 개수를 count해준다.

    - count_dict의 길이가 1이면 리스트의 숫자가 다 같다는 거니까 iter()로 dict의 반복자를 가져와서 next()를 이용해 dict의 첫 번째 키 값을 가져와서 계산한다.

    - count_dict의 길이가 2이면 모두 겹치지는 않지만 두 개 이상은 겹친다는 거니까 value 값이 제일 큰 key 값만 딕셔너리에서 가져오면 된다. 그러기 위해서 max 함수를 이용해서 max(count_dict, key=count_dict.get) 구하면 된다.

    하나씩 설명하면 max()는 시퀀스에서 가장 큰 값을 반환하는 함수이고,

    첫 번째 인자인 count_dict은 여기서 값을 가져온다는 거다.

    두 번째 인자인 key=count_dict.get은 key 값을 기준으로 count_dict의 value 값을 반환한다3는 것이다.

    그럼 다 합쳐서 설명하면 count_dict에서 각 key값 중 가장 큰 value를 가지는 key 값 하나만 반환한다 라는 것이다.

    굳이 반복문을 사용하지 않고 값들을 가져오고 싶어서 이렇게 사용했다. (반복문 쓰면 줄 수만 길어짐)

    - 마지막 count_dict의 길이가 1, 2가 아닌 것, 즉, 이 문제에서는 각각 다른 값을 가지고 있다는 것이다.

    이거는 max(count_dict.keys()) 를 이용해서 가장 큰 키 값만 가져오면 된다.

     

    근데 저 조건문으로는 리스트 값이 3개 인것만 다룰 수 있다. 4개에서 3개를 겹치면 그거에 대한 값을 못 가져온다.

    그래서 조건문 else를 전부 겹치지 않지만 2개 이상 겹치는 것으로 해놓고 조건을 걸면 리스트 값이 여러 개가 와도 정상적으로 작동하게할 수 있다.

    num_list = [4, 3, 7, 8, 7, 7]
    count_dict = {}
    money = 0

    for num in num_list:
        try: count_dict[num] += 1
        except: count_dict[num]=1

    if len(num_list) == len(count_dict):
        money = max(count_dict.keys()) * 100
    elif len(count_dict) == 1:
        money = 10000 + next(iter(count_dict)) * 1000
    else:
        money = 1000 + max(count_dict, key=count_dict.get) * 100

    print(money)

     

    여기서의 주요한 함수 설명

    max()는 위에서 설명했으니 패스

    iter() 딕셔너리의 키에 대한 반복자를 만든다.

    반복자는 데이터 컬렉션 즉, 리스트 튜플 딕셔너리 등 같은거에서 항목을 순차적으로 접근할 수 있게 해주는 객체입니다.

    next() 함수는 반복자로부터 다음 항목을 반환하는 함수입니다. 더 이상 항목이 없을 경우 StopIteration 예외가 발생합니다. 그니까 위에서 반복문을 사용하지 않고 그냥 뽑았으니 첫번째 값을 뽑은 겁니다.

     

    반복자는 메모리 효율성이 좋고 데이터가 필요할 떄만 계산되므로 계산 비용을 줄일 수 있습니다.

     

     

    이렇게 다시 python에 대한 함수 공부하기 재밌다.

    '백준 코딩테스트 > 조건문' 카테고리의 다른 글

    2525번 오븐 시계  (0) 2024.10.16
    2884번 알람 시계  (1) 2024.10.16
    14681번: 사분면 고르기  (1) 2024.10.16
    2753번: 윤년  (0) 2024.10.16
    9498번: 시험 성적  (0) 2024.10.16
Designed by Tistory.