문제
가톨릭대학교에 다니는 컴퓨터정보공학부 황톨릭은 코로나 때문에 슬퍼하는 친구들을 위해 게임을 하나 만들었다.
게임이 시작되면 알파벳 대문자로만 이루어진 문자열이 주어진다. 문자열이 주어지면 각 문자의 획수로 문자를 변환한다. 획수들을 갖고 앞에서부터 두 개씩 더해가는데 만약 짝이 지어지지 않는다면 그대로 다음 단계로 내려간다. 다음 단계부터는 이전 단계에서 두 개씩 더해가며 생성된 숫자들을 가지고 같은 과정을 반복한다. 과정을 반복하다가 결국 마지막 한 개의 수가 남았을 때 그 수가 홀수라면 이기는 것이고 짝수라면 지는 게임이다!!
예를 들어 "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 |