일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 그리디알고리즘
- 종합설계
- 모각코
- B대면노래방
- 함밥
- programmers
- 최소스패닝트리
- Bellman-Ford
- Planned
- 데이터베이스
- 백준
- 동적계획법
- codetree
- BFS
- 알고리즘
- 파이썬
- 프로그래머스
- 코드트리
- 소프트웨어공학
- django
- 백트래킹
- DFS
- 마라마라빔
- DP
- minimum spanning tree
- 실습
- Kruskal
- 장고
- MyPlaylist
- SQL
- Today
- Total
Leta Learns
[Python] 백준 2621번 - 카드게임 본문
문제 https://www.acmicpc.net/problem/2621
역시나 어려운 구현 문제..
card 변수에 색과 숫자를 리스트로 입력 받은 후 colors, numbers에 각각 색과 숫자 정보를 따로 넣어주었다.
색과 숫자의 개수를 구하기 위해 cnt_color 딕셔너리와 cnt_num 리스트를 만들었다.
for문을 돌려서 입력 받은 카드의 색과 숫자를 확인하며 cnt를 1씩 증가시켜주면 초기 작업이 끝난다.
9개의 조건을 만들어줄 차례이다.
먼저 고려할 점은 두 가지 이상의 규칙을 적용할 수 있는 경우 가장 높은 점수를 출력하여야 한다는 점이다.
if-elif 문을 사용하기 위해 가장 높은 점수를 받을 수 있는 조건부터 차례대로 조건문을 작성하였다.
본 문제의 경우 문제에서 제공한 조건 순서 그대로 하나하나 구현하면 된다.
우선 연속 숫자를 찾아야 하는 조건들(조건 1,5)을 구현하기 위해 sort_nums 라는 변수에 numbers 리스트를 복사하고 정렬해주었다. 리스트 복사는 .copy()
1번 조건은 카드 5장이 모두 같은 색상인 경우이므로, cnt_color의 값들 중 5가 존재하는 경우를 말한다. (5를 제외한 나머지 cnt_color의 값들은 전부 0)
그 후에 and를 사용하여 연속하는 숫자들 조건을 넣어주었다.
연속 숫자 찾는 조건은 더 쉽고 간단한 조건이 있을 것 같긴 한데.. 내 머리로는 아직 생각이 나지 않아서 그냥 노가다로 구현하였다. ㅎㅎ
5번 조건은 1번 조건에서 카드 5장이 모두 같은 색상이어야 하는 조건을 빼주면 된다.
7, 8번 조건은 하나의 elif 문에서 작성하였다.
7번: 카드 5장 중 2장의 숫자가 같은 경우가 2개.
8번: 카드 5장 중 2장의 숫자가 같은 경우가 1개.
우선 2장의 숫자가 같은 한 가지 경우를 first 변수에 할당한다.
num1에 numbers 리스트를 복사한 후 for문을 돌려 numbers에서 first 변수에 해당하는 숫자를 삭제한다.
numbers에서 first를 삭제하였으므로 first의 개수도 0으로 변경해주어야 한다. (cnt_num[first] = 0)
이제 2장의 숫자가 같은 한 가지 경우(first)를 제외하고 생각할 수 있다.
남은 것들 중에서 또 2장의 숫자가 같은 경우(second)가 있다면 7번 조건, 없다면 8번 조건에 해당한다.
2, 3, 4, 6, 9 조건은 어렵지 않게 구현할 수 있으니 넘어간다.
마지막으로 구한 score를 출력해주면 끝.
import sys
input = sys.stdin.readline
card = [list(input().split()) for _ in range(5)]
colors = [i[0] for i in card]
numbers = [int(i[1]) for i in card]
cnt_color = {'R':0, 'B':0, 'Y':0, 'G':0}
cnt_num = [0 for _ in range(11)]
for i in range(5):
color, number = card[i][0], int(card[i][1])
cnt_color[color] += 1
cnt_num[number] += 1
#1
sort_nums = numbers.copy()
sort_nums.sort()
if 5 in cnt_color.values() and sort_nums[0]+1 == sort_nums[1] and sort_nums[1]+1 == sort_nums[2] and sort_nums[2]+1 == sort_nums[3] and sort_nums[3]+1 == sort_nums[4]:
score = max(numbers) + 900
#2
elif 4 in cnt_num:
score = cnt_num.index(4) + 800
#3
elif 3 in cnt_num and 2 in cnt_num:
score = cnt_num.index(3)*10 + cnt_num.index(2) + 700
#4
elif 5 in cnt_color.values():
score = max(numbers) + 600
#5
elif sort_nums[0]+1 == sort_nums[1] and sort_nums[1]+1 == sort_nums[2] and sort_nums[2]+1 == sort_nums[3] and sort_nums[3]+1 == sort_nums[4]:
score = max(numbers) + 500
#6
elif 3 in cnt_num:
score = cnt_num.index(3) + 400
#7, 8
elif 2 in cnt_num:
first = cnt_num.index(2)
num1 = numbers.copy()
for i in num1:
if i == first:
numbers.remove(i)
cnt_num[first] = 0
if 2 in cnt_num: #7
second = cnt_num.index(2)
score = max(first, second)*10 + min(first, second) + 300
else: #8
score = first + 200
#9
else:
score = max(numbers) + 100
print(score)
'Coding > 백준' 카테고리의 다른 글
[Python] 백준 8979번 - 올림픽 (0) | 2022.01.19 |
---|---|
[Python] 백준 1747번 - 소수&팰린드롬 (0) | 2022.01.17 |
[Python] 백준 1647번 - 도시 분할 계획 (0) | 2021.08.28 |
[Python] 백준 9205번 - 맥주 마시면서 걸어가기 (0) | 2021.08.26 |
[Python] 백준 6497번 - 전력난 (0) | 2021.08.20 |