코딩테스트/백준

[백준/Python] 20154_이 구역의 승자는 누구야?!_Python 풀이

vulter3653 2022. 4. 12. 23:13

https://www.acmicpc.net/problem/20154

 

20154번: 이 구역의 승자는 누구야?!

첫째 줄에 알파벳 대문자로만 이루어진 길이 K(1 ≤ K ≤ 1,000,000)인 문자열 S가 주어진다.

www.acmicpc.net

이 구역의 승자는 누구야?!

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
1초 1024 MB 643 429 353 66.353%

문제


가톨릭대학교에 다니는 컴퓨터정보공학부 황톨릭은 코로나 때문에 슬퍼하는 친구들을 위해 게임을 하나 만들었다.

게임이 시작되면 알파벳 대문자로만 이루어진 문자열이 주어진다. 문자열이 주어지면 각 문자의 획수로 문자를 변환한다. 획수들을 갖고 앞에서부터 두 개씩 더해가는데 만약 짝이 지어지지 않는다면 그대로 다음 단계로 내려간다. 다음 단계부터는 이전 단계에서 두 개씩 더해가며 생성된 숫자들을 가지고 같은 과정을 반복한다. 과정을 반복하다가 결국 마지막 한 개의 수가 남았을 때 그 수가 홀수라면 이기는 것이고 짝수라면 지는 게임이다!!

예를 들어 "ABCDE"라는 문자열이 주어지면 ‘A’, ‘B’, ‘C’, ‘D’, ‘E’ 각 문자의 획수인 3, 2, 1, 2, 3으로 바꾸어 아래의 그림처럼 과정을 진행한다. 단, 계산할 때, 더한 값이 10을 넘는다면 10으로 나눈 나머지로 바꿔준다.

‘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

입력


첫째 줄에 알파벳 대문자로만 이루어진 길이 K(1 ≤ K ≤ 1,000,000)인 문자열 S가 주어진다.

 

출력


첫째 줄에 정답을 출력한다.

마지막으로 남은 수가 홀수라면 "I'm a winner!"를 출력하고 0이거나 짝수라면 "You're the winner?"를 출력한다.

 

예제 입력 1


ABCDE

예제 출력 1


I'm a winner!

예제 입력 2


AECF

예제 출력 2


You're the winner?

풀이


1. 알파벳과 그에 해당하는 획수를 각각 리스트 형태로 만들어서 dictionary 로 묶어 알파벳을 key로 그에 해당하는 획수를 value로 하였다.

 

2. 입력되는 값의 요소가 존재할 경우, 계속 반복되도록 while문을 사용하였고

    입력되는 값의 요소가 없을 경우, except와 break를 통해 무한루프가 끝나도록 하였다.

 

3. 입력되는 값을 리스트 형태로 만들어 안의 요소를 pop(0) 을 통해 앞에서부터 하나씩 출력되도록 하였다.

 

4. pop을 통해 출력된 값이 dictionary의 key에 존재하면 그에 해당하는 value값이 int형으로 하나씩 y에 입력되도록 하였다. 

 

5. 문제에서는 최종적으로 남은 수가 홀수라면 "I'm a winner!"를 출력하고 0이거나 짝수라면 "You're the winner?"를 출력한다. 그리고 계산할 때, 더한 값이 10을 넘는다면 10으로 나눈 나머지로 바꿔준다.

 

이때, 계산할 때 10을 넘어서 10으로 나눈 나머지의 경우와 10으로 나누지 않고 그대로 더하는 경우에서의 일의 자리 수는 변하지 않는다. 

 

e.g) 

7+5 = 12 -> 12을 10으로 나눈 나머지는 2, 이는 12에서의 일의 자리 수와 동일하다.

이는 일의 자리가 같기에 2 로 나눠도 나머지가 동일한 값이 나오는 것을 알 수 있다.

 

따라 sum을 통해 요소를 모두 더한 값에서 2로 나눠 나머지가 홀수인 경우 "I'm a winner!"를 출력하고 0이거나 짝수라면 "You're the winner?"를 출력하도록 하였다.

 

x = input()                                         #구하고자 하는 영문 입력
y = []                                                #입력되는 값에 해당되는 숫자값이 저장되는 리스트

a ='ABCDEFGHIJKLMNOPQRSTUVWXYZ'   #알파벳 key 값
b ='32123333113133122212112221'        #알파벳에 해당하는 value 값

c = list(a) 
d = list(b)

point = dict(zip(c,d))                            #알파벳과 알파벳에 해당하는 숫자 값의 dictionary

e = list(x)                                          #입력되는 값을 리스트 형태로 변환

while True:                                         #리스트로 변환된 영문 값이 존재할 경우 무한루프
  try:
    f = e.pop(0)                                   #입력되는 값 제거하고 출력
    if f in point:                                   #출력된 알파벳이 key값으로 존재할 경우
      y.append(int(point[f]))                    #value값 int형으로 숫자값 저장
  except:                                           #입력되는 값이 존재하지 않을 경우 예외처리
    if sum(y)%2==1:                             #나머지가 1이면 "I'm a winner!" 출력
      print("I'm a winner!")
      break                                         #무한루프 벗어나기
    else:                                            #나머지가 1이 아닐 경우 "You're the winner?" 출력
      print("You're the winner?")
      break                                        #무한루프 벗어나기

#sys를 이용하여 입력할 경우

import sys

y = []

a ='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
b ='32123333113133122212112221'

c = list(a)
d = list(b)

point = dict(zip(c,d))

e = list(sys.stdin.readline())

while True:
  try:
    f = e.pop(0)
    if f in point:
      y.append(int(point[f]))
  except:
    if sum(y)%2==1:
      print("I'm a winner!")
      break
    else:
      print("You're the winner?")
      break