본문 바로가기
코딩테스트 파이썬/문자열

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

by 백엔드 개발자 2021. 9. 13.

문제

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

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

예를 들어 "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?"를 출력한다.

 

 

 

 

입력받은 문자열을 획수로 변경한 후, 2개씩 더해서 조건대로 출력하면 되는 문제.

 

이 문제의 핵심은 더하면서 계속 낱개로 나눈것과 전부 더하고 한번에 나누는 것은 같다는 수학적 지식이었다.

 

그래서 처음에는 그대로 구현해서 복잡했고, 두번째에는 획수로 변환한 숫자를 전부더한 후 나눴다.

 

획수는 딕셔너리를 써도 되지만, 아스키코드와 배열인덱스를 이용해서 변환했다.

 

 

numConvert=[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]
#ord('A')-65 = 인덱스 번호
arr=input()
num=[]
#획으로 변환
for i in range(len(arr)):
    num.append( numConvert[
int(ord(arr[i])-65) ] )

result=
sum(num)%10

if result%2==0:
   
print("You're the winner?")
else:
   
print("I'm a winner!")

 

 

 

 

 

 

 

 

'코딩테스트 파이썬 > 문자열' 카테고리의 다른 글

1181 단어정렬 파이썬  (0) 2021.09.14
1316 그룹단어체커 파이썬  (0) 2021.09.14
10798 세로읽기 파이썬  (0) 2021.09.13
9046 복호화 파이썬  (0) 2021.09.09
11365 !밀비 급일 파이썬  (0) 2021.09.08