반응형

안녕하세요 밤샘공부입니다~

질문이 있으시면, 아래 오픈채팅방이나 메일로 보내주세요~

[백준 2480번 파이썬]

2시간 이내에 답변 드리겠습니다. 

 

오픈챗 링크 : https://open.kakao.com/o/srASNxef

메일 주소 : studying.all.night.1114@gmail.com

 

전달력을 높이기 위해 평어체를 사용하였습니다.

 


1. 문제 설명

 

 (1) 문제

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개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.

 (2) 입력

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

 

 (3) 출력

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

 

 (4) 예제 

  ① 예시 1

   - 입력

3 3 6

   - 출력

1300

 

 


2. 문제 해석 및 총평

 

   겉보기에는, 별 다른 특징 없는 평벙한 조건문 문제이다. 그러나 우리가 해당 문제에서 얻을 수 있는 부분은 '조건의 순서에 따라 문제가 복잡해질 수도 간단해질 수 있으며, 심지어는 틀릴 가능성도 있다' 라는 것이다. 예를 들어 설명해 볼테니 꼭 이해하고 넘어가도록 하자. (자주 실수하는 부분이다!!)

 

 

 (1) 구조도 잘못된 예시

   결론적으로, 다음 구조도는 틀렸다! 왜 틀렸을지 고민해 보자. (구조도가 익숙치 않다면 앞선 18강, 19강을 보고오면 좀 더 이해가 잘 될 것이다)

[잘못된 구조도]

   얼핏보면, 문제가 없어 보인다. 실제로 대부분의 상황에서는 문제가 없으나 "세 수가 같은 상황"에서 문제가 발생한다. 세 수가 같다는 것은 두 수가 같다는 것을 포함하고 있다. 즉, 세 수가 같은 상황에서 처음 조건(두수가 같은가?)을 '참'이라고 인식하는 것이다. 따라서 위 구조도를 따르기 위해서는 첫 번째 조건에 추가적으로 (세 수가 같지 않아야 한다.) 라는 조건이 필요하다. 그러나 이렇게 코드를 짜는 것 보다는 처음 부터 세수가 같은지를 체크하는 것이 훨씬 수월하기에 아래와 같이 구조도를 짜는 것이 베스트이다. 

 

 

 (2) 구조도 모범 예시

[올바른 구조도]

    이제 이를 바탕으로 코드를 구현해보자.


3. 코드

 

 (1) 구조도를 그대로 옮기기

# 모범답안

a, b, c = map(int, input().split())

if a == b == c :
    print(10000 + 1000*a)
else :
    if a == b :
        print(1000 + 100*a)
    elif b == c :
        print(1000 + 100*b)
    elif c == a :
        print(1000 + 100*c)
    else :
        print(max(a, b, c)*100)

   처음에 그렸던 구조도를 그대로 코드로 옮겼다. 직관적이면서 가장 간편한 풀이이다. 하지만, 중간에 두 수를 비교하는 과정이 조금 복잡해 보인다. 어떻게 하면 코드를 좀 더 간결하게 쓸 수 있을까? 

 

 (2) 두 수를 비교하는 간단한 방법

# 추가풀이

a, b, c = map(int, input().split())

if a == b == c :
    print(10000 + 1000*a)
elif a == b or b == c or c == a :
    print(1000 + 100*sorted([a, b, c])[1])
else :
    print(100*max([a, b, c]))

   여기서 두 수가 같은 상황에서 쓰인 sorted([a, b, c])[1]에 집중하면 되는데, 일단 'sorted'는 리스트를 정렬하는 파이썬 내장 함수이다. 즉, a, b, c를 크기 순서대로 정렬해라라는 뜻이다. 그런데 수학적으로 생각해보면 두 수가 같은 상황에서 세 수를 정렬하면, 당연히 가운데 수는 같은 두 수 중 하나가 오게 된다. ex) 1, 4, 1 정렬 -> 1, 1, 4 (가운데에 1이 옴) / 10, 10, 3 정렬 -> 3, 10, 10 (가운데에 10이 옴) 그러므로, 같은 눈의 수는 정렬 후 1번인덱스에 올 수밖에 없으므로 굳이 a와 b가 같은지 / b와 c가 같은지 / c와 a가 같은지를 따로따로 확인해줄 필요가 없어진다.

반응형