[백준 2480번 주사위 세개] 20강. 백준 단계별로 풀어보기 <2-7>
안녕하세요 밤샘공부입니다~
질문이 있으시면, 아래 오픈채팅방이나 메일로 보내주세요~

2시간 이내에 답변 드리겠습니다.
오픈챗 링크 : https://open.kakao.com/o/srASNxef
메일 주소 : studying.all.night.1114@gmail.com
전달력을 높이기 위해 평어체를 사용하였습니다.
1. 문제 설명
(1) 문제
|
1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.
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가 같은지를 따로따로 확인해줄 필요가 없어진다.
'밤샘코딩 > 백준 AtoZ' 카테고리의 다른 글
| [백준 10950번 A+B - 3] 22강. 백준 단계별로 풀어보기 <3-2> (1) | 2023.05.10 |
|---|---|
| [백준 2739번 구구단] 21강. 백준 단계별로 풀어보기 <3-1> (0) | 2023.05.05 |
| [백준 2525번 오븐시계] 19강. 백준 단계별로 풀어보기 <2-6> (0) | 2023.04.28 |
| [백준 2884번 알람시계] 18강. 백준 단계별로 풀어보기 <2-5> (0) | 2023.04.27 |
| [백준 14681번 사분면 고르기] 17강. 백준 단계별로 풀어보기 <2-4> (0) | 2023.04.26 |
댓글
이 글 공유하기
다른 글
-
[백준 10950번 A+B - 3] 22강. 백준 단계별로 풀어보기 <3-2>
[백준 10950번 A+B - 3] 22강. 백준 단계별로 풀어보기 <3-2>
2023.05.10 -
[백준 2739번 구구단] 21강. 백준 단계별로 풀어보기 <3-1>
[백준 2739번 구구단] 21강. 백준 단계별로 풀어보기 <3-1>
2023.05.05 -
[백준 2525번 오븐시계] 19강. 백준 단계별로 풀어보기 <2-6>
[백준 2525번 오븐시계] 19강. 백준 단계별로 풀어보기 <2-6>
2023.04.28 -
[백준 2884번 알람시계] 18강. 백준 단계별로 풀어보기 <2-5>
[백준 2884번 알람시계] 18강. 백준 단계별로 풀어보기 <2-5>
2023.04.27