2 분 소요

1. 문제

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

  • String 문자열 처리 문제
// 문제
시윤이는 좋아하는 이성이 생기면 가장 먼저 이름궁합부터 본다.
이름궁합을 보는 방법은 간단하다.
먼저 이름을 알파벳 대문자로 적는다.
 알파벳 대문자에는 다음과 같이 알파벳을 적는데 필요한 획수가 주어진다.
예를 들어,  사람의 이름인 LEESIYUN, MIYAWAKISAKURA  같이 표현했을 
다음과 같이 먼저 주어진 이름부터  글자씩 적는다.

알파벳	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	4	3	1	3	1	1	3	1	3	2	1	2	2	2	1	2	1	1	1	2	2	1
 사람의 이름을 알파벳 대문자로 표현한 ,  글자씩 번갈아가며 적는다.

예시 :  L M E I E Y S A I W Y A U K N I S A K U R A

예시처럼 이름이 남을 경우엔 뒤에 남은 글자인 S A K U R A를  뒤에 적는다.
그러고 나서 알파벳을 대응하는 숫자로 바꾸고
 숫자와  숫자의 오른쪽 숫자와 더한 것을 밑에 적는다.
더한 숫자가 10 넘을 경우엔 일의 자리 수만 남긴다.
 과정을 반복하여 숫자가 2개만 남았을 
남은 숫자가  사람의 궁합이 좋을 확률이 된다.

과정을 자세히 나타내면 다음과 같다.

초기 상태 : 1 3 4 1 4 2 1 3 1 1 2 3 1 3 2 1 1 3 3 1 2 3
한번 수행 :  4 7 5 5 6 3 4 4 2 3 5 4 4 5 3 2 4 6 4 3 5
두번 수행 :   1 2 0 1 9 7 8 6 5 8 9 8 9 8 5 6 0 0 7 8
세번 수행 :    3 2 1 0 6 5 4 1 3 7 7 7 7 3 1 6 0 7 5
...
19 수행 :                  5 7 0
20 수행 :                   2 7
따라서 LEESIYUN와 MIYAWAKISAKURA이 궁합이 좋을 확률이 27%이다.

// 입력
 번째 줄에 이름의 길이 N과 M을 받는다. (2  N, M  100)

다음 줄에 이름 A와 B를 입력받는다. 이름은 반드시 알파벳 대문자만 주어진다.

// 출력
A와 B의 이름궁합이 좋을 확률을 % 출력한다.
, 십의 자리가 0 경우엔 일의 자리만 출력한다.

// 예제 입력 1
8 14
LEESIYUN MIYAWAKISAKURA

// 예제 출력 1
27%

// 예제 입력 2
2 2
AB CD

// 예제 출력 2
77%

// 예제 입력 3
3 2
BOJ IN

// 예제 출력 3
1%


2. 핵심 아이디어

  • ord 함수는 아스키 코드를 숫자로 표현하는 함수
  • alp(ord(‘C’) - ord(‘A’)) = alp(2) 이므로 C의 획수를 찾을 수 있음


3. Python 문제풀이

import sys
input = sys.stdin.readline

n, m = map(int, input().split())
a, b = input().rstrip().split()

alp = [3, 2, 1, 2, 4, 3, 1, 3, 1, 1, 3, 1, 3, 2, 1, 2, 2, 2, 1, 2, 1, 1, 1, 2, 2, 1]

ab = ''
min_len = min(n, m)

for i in range(min_len) :
  ab += a[i] + b[i]
ab += a[min_len:] + b[min_len:]

arr = [alp[ord(i)-ord('A')] for i in ab]

for i in range(n + m - 2) :
  for j in range(n + m - 1 - i) :
    arr[j] += arr[j + 1]

print("{}%".format(arr[0] % 10 * 10 + arr[1] % 10))


4. Java 문제풀이


댓글남기기