문제
빨간색, 파란색, 노란색, 녹색의 네 가지 색이 있는 카드가 있고 각 색깔별로 1부터 9까지 숫자가 쓰여져있다. 총 36장의 카드에서 5장의 카다를 뽑고 아래와 같은 규칙으로 계산한다.
1. 카드 5장이 모두 같은 색이고 숫자가 연속될 때 가장 높은 숫자에 900을 더한다.
2. 카드 5장 중 4장의 숫자가 같을 때 점수는 같은 숫자에 800을 더한다.
3. 3장의 숫자가 같고 2장의 숫자도 같을 때 3장이 같은 숫자에 10을 곱하고 2장이 같은 숫자를 더한 다음 700을 더한다.
4. 5장의 숫자가 연속적일 때 점수는 가장 높은 숫자에 600을 더한다.
5. 카드 5장의 숫자가 연속적일 때 가장 높은 숫자에 500을 더한다.
6. 3장의 숫자가 같을 때 점수는 숫자에 400을 더한다.
7. 2장의 숫자가 같고 또 다른 2장의 숫자가 같을 때 큰 숫자에 10을 곱하고 작은 숫자를 더한 다음 300을 더한다.
8. 2장의 숫자가 같을 때 점수는 같은 숫자에 200을 더한다.
9. 위의 어떤 경우에도 해당하지 않을 때 가장 큰 숫자에 100을 더한다.
두 가지 이상의 규칙에 적용시킬 수 있을 때 가장 높은 점수를 출력한다.
입력
다섯 줄에 걸쳐서 카드의 색깔과 숫자가 빈 칸을 사이에 두고 입력된다.
출력
카드의 점수를 출력한다.
접근
주어진 조건대로 빠짐없이 구현하는 것이 중요하다.
점수의 조건을 좀 더 쉽게 구현하기 위해 색깔의 개수와 숫자의 개수를 따로 저장하여 조건을 분리할 때 사용한다.
구현
- 5장의 카드를 입력받아 (색깔, 숫자)의 쌍으로 card_list에 저장한다.
- 이후 색깔의 개수를 color_count에 저장하고, 숫자의 개수를 number_count에 저장한다.
card_list = []
color_count = {
'R':0,
'B':0,
'Y':0,
'G':0,
}
number_count = [0] * 10
for _ in range(5):
color, number = map(str, input().split())
number = int(number)
card_list.append((color, number))
color_count[color] += 1
number_count[number] += 1
- solve함수에서 조건을 모두 나눠서 처리한다.
def solve():
# 1
if 5 in color_count.values():
count = 0
max_num = 0
for number, cnt in enumerate(number_count):
if cnt > 0:
count += 1
max_num = max(max_num, number)
else:
count = 0
if count == 5:
break
if count == 5:
result = max_num + 900
return result
# 2
elif 4 in number_count:
number = number_count.index(4)
result = 800 + number
return result
# 3
elif 3 in number_count and 2 in number_count:
number3 = number_count.index(3)
number2 = number_count.index(2)
result = number3 * 10 + number2 + 700
return result
# 4
if 5 in color_count.values():
max_num = 0
for color, number in card_list:
if max_num < number:
max_num = number
result = 600 + number
return result
# 5
cnt = 0
max_num = 0
for number, count in enumerate(number_count):
if count > 0:
cnt += 1
max_num = max(max_num, number)
else:
cnt = 0
if cnt == 5:
break
if cnt == 5:
result = 500 + max_num
return result
# 6
if 3 in number_count:
number = number_count.index(3)
result = 400 + number
return result
# 7
cnt = 0
max_num = 0
min_num = 9
for number, count in enumerate(number_count):
if count == 2:
cnt += 1
max_num = max(max_num, number)
min_num = min(min_num, number)
if cnt == 2:
break
if cnt == 2:
result = 10 * max_num + min_num + 300
return result
# 8
if 2 in number_count:
number = number_count.index(2)
result = 200 + number
return result
# 9
max_num = 0
for color, number in card_list:
if max_num < number:
max_num = number
return 100 + max_num
전체 코드
import sys
input = sys.stdin.readline
def solve():
# 1
if 5 in color_count.values():
count = 0
max_num = 0
for number, cnt in enumerate(number_count):
if cnt > 0:
count += 1
max_num = max(max_num, number)
else:
count = 0
if count == 5:
break
if count == 5:
result = max_num + 900
return result
# 2
elif 4 in number_count:
number = number_count.index(4)
result = 800 + number
return result
# 3
elif 3 in number_count and 2 in number_count:
number3 = number_count.index(3)
number2 = number_count.index(2)
result = number3 * 10 + number2 + 700
return result
# 4
if 5 in color_count.values():
max_num = 0
for color, number in card_list:
if max_num < number:
max_num = number
result = 600 + number
return result
# 5
cnt = 0
max_num = 0
for number, count in enumerate(number_count):
if count > 0:
cnt += 1
max_num = max(max_num, number)
else:
cnt = 0
if cnt == 5:
break
if cnt == 5:
result = 500 + max_num
return result
# 6
if 3 in number_count:
number = number_count.index(3)
result = 400 + number
return result
# 7
cnt = 0
max_num = 0
min_num = 9
for number, count in enumerate(number_count):
if count == 2:
cnt += 1
max_num = max(max_num, number)
min_num = min(min_num, number)
if cnt == 2:
break
if cnt == 2:
result = 10 * max_num + min_num + 300
return result
# 8
if 2 in number_count:
number = number_count.index(2)
result = 200 + number
return result
# 9
max_num = 0
for color, number in card_list:
if max_num < number:
max_num = number
return 100 + max_num
card_list = []
color_count = {
'R':0,
'B':0,
'Y':0,
'G':0,
}
number_count = [0] * 10
for _ in range(5):
color, number = map(str, input().split())
number = int(number)
card_list.append((color, number))
color_count[color] += 1
number_count[number] += 1
card_list = sorted(card_list, key=lambda x: x[1])
answer = solve()
print(answer)
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준 14002] 가장 긴 증가하는 부분 수열 4 (0) | 2021.04.29 |
---|---|
[백준 16234] 인구이동 (0) | 2021.04.28 |
[백준 13335] 트럭 (0) | 2021.04.26 |
[백준 10282] 해킹 (0) | 2021.04.24 |
[백준 1238] 파티 (0) | 2021.04.24 |