Post
이 구역의 승자는 누구야?(백준 20154번) | Gihun Son

이 구역의 승자는 누구야?(백준 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인 홀수이므로 이 게임은 이기게 되는 것이다.

게임의 심판역할인 톨릭이는 매번 계산하는 게 귀찮아 코드를 짜놓고 싶어한다. 톨릭이를 도와 코드를 짜주자!!

알파벳 대문자의 획수는 아래 표와 같다.

ABCDEFGHIJKLMNOPQRSTUVWXYZ
32123333113133122212112221

Untitled

나의 풀이

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()를 사용해서 왼쪽에서 값을 뺄 수 있도록 설정하였다.

더 간단한 풀이

Untitled 1

출처: 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.