이 구역의 승자는 누구야?(백준 20154번)
문제
가톨릭대학교에 다니는 컴퓨터정보공학부 황톨릭은 코로나 때문에 슬퍼하는 친구들을 위해 게임을 하나 만들었다.
게임이 시작되면 알파벳 대문자로만 이루어진 문자열이 주어진다. 문자열이 주어지면 각 문자의 획수로 문자를 변환한다. 획수들을 갖고 앞에서부터 두 개씩 더해가는데 만약 짝이 지어지지 않는다면 그대로 다음 단계로 내려간다. 다음 단계부터는 이전 단계에서 두 개씩 더해가며 생성된 숫자들을 가지고 같은 과정을 반복한다. 과정을 반복하다가 결국 마지막 한 개의 수가 남았을 때 그 수가 홀수라면 이기는 것이고 짝수라면 지는 게임이다!!
예를 들어 “ABCDE
“라는 문자열이 주어지면 ‘A
’, ‘B
’, ‘C
’, ‘D
’, ‘E
’ 각 문자의 획수인 3, 2, 1, 2, 3으로 바꾸어 아래의 그림처럼 과정을 진행한다. 단, 계산할 때, 더한 값이 10을 넘는다면 10으로 나눈 나머지로 바꿔준다.
https://upload.acmicpc.net/949da89b-426f-41da-bac6-dde8835b0922/-/preview/
‘E
’의 경우는 짝을 지을 수 없으므로 3이 바로 내려오게 된다. 결국, 마지막 남은 수가 1인 홀수이므로 이 게임은 이기게 되는 것이다.
게임의 심판역할인 톨릭이는 매번 계산하는 게 귀찮아 코드를 짜놓고 싶어한다. 톨릭이를 도와 코드를 짜주자!!
알파벳 대문자의 획수는 아래 표와 같다.
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
3 | 2 | 1 | 2 | 3 | 3 | 3 | 3 | 1 | 1 | 3 | 1 | 3 | 3 | 1 | 2 | 2 | 2 | 1 | 2 | 1 | 1 | 2 | 2 | 2 | 1 |
나의 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from collections import deque
al_num=[3,2,1,2,3,3,3,3,1,1,3,1,3,3,1,2,2,2,1,2,1,1,2,2,2,1]
S=input()
answer=deque()
for s in S:
answer.append(al_num[ord(s)-ord('A')])
while len(answer)!=1:
tmp=deque()
while len(answer)>1:
n1=answer.popleft()
n2=answer.popleft()
n=n1+n2
if n>10:
tmp.append(n%10)
else:
tmp.append(n)
if answer:
tmp.append(answer.popleft())
answer=tmp
if answer[0]%2==1:
print("I'm a winner!")
else:
print("You're the winner?")
- 위 문제는 각 획수를 저장해놓은 list를 통해, 주어진 문자열의 획수를 저장하여 풀이한 방식이다.
- deque()를 사용해서 왼쪽에서 값을 뺄 수 있도록 설정하였다.
더 간단한 풀이
출처: https://ssafy-story.tistory.com/72
- 생각해보니 토너먼트 형식으로 더하는 것으로 되어있지만, 결국 값을 다 더하고 10으로 나눈 나머지와 같다는 것을 알았다.. 훨씬 간단하다.
추가적인 문법
from collections import deque
deque()
는collections
안에 있다는 것을 잊지 말자
This post is licensed under CC BY 4.0 by the author.