[Baekjoon] #15312 이름 궁합 (Python)

seongminn·2022년 6월 15일
0

Algorithm

목록 보기
11/26
post-thumbnail

📝 문제

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

💬 풀이 방법

아이디어

아스키 코드를 활용하여 입력 받은 알파벳의 획수를 알아낸다. 이후 while 반복문 내에서 남은 숫자가 2가 될 때까지 인접한 수를 더해주는 간단한 문제다.

첫 시도에는 데이터의 자료형을 반복적으로 변경하여 PyPy를 사용해야만 통과할 수 있었다. 그래서 Int 자료형으로만 값을 처리하기 위해 배열을 사용하였고, 결국 Python으로도 통과할 수 있었다.

알고리즘

  1. 문제에서 제공하는 힌트와 입력값을 각각 hint, a, b에 저장하고, 빈 배열 arr를 생성한다.
  2. 아스키 코드를 활용하여 arr에 알파벳의 획수를 하나씩 삽입한다.
  3. 빈 배열 temp를 하나 더 만들어 주고, arr의 길이가 2가 될 때까지 인접한 값들의 합의 1의 자리를 temp에 삽입한다.
  4. arr의 값을 temp로 초기화 시켜주고, temp는 비워준다.
  5. arr의 길이가 2가 되면 반복문이 종료되고, 요소를 공백 없이 출력한다.

💻 소스코드

hint = [3, 2, 1, 2, 3, 3, 2, 3, 3, 2, 2, 1, 2, 2, 1, 2, 2, 2, 1, 2, 1, 1, 1, 2, 2, 1]

a = input()
b = input()
arr = []

# 알파벳의 아스키 코드에서 65를 빼면 hint에서 해당 알파벳의 인덱스를 구할 수 있다. 이를 arr 배열에 삽입한다.
for i in range(len(a)):
	arr.append(hint[ord(a[i]) - 65])
	arr.append(hint[ord(b[i]) - 65])

temp = []

# arr의 길이가 2가 될 때까지 반복
while len(arr) != 2:
	for idx in range(1, len(arr)):
    	# 인접한 값들의 합을 10으로 나누었을 때, 그 나머지는 1의 자리와 같다.
		temp.append((arr[idx] + arr[idx-1]) % 10)

	arr = temp
	temp = []

print(f"{arr[0]}{arr[-1]}")

--

아래의 알고리즘은 처음에 시도했던, PyPy로만 통과한 코드이다. 참고만 할 수 있도록 하자.

hint = [3, 2, 1, 2, 3, 3, 2, 3, 3, 2, 2, 1, 2, 2, 1, 2, 2, 2, 1, 2, 1, 1, 1, 2, 2, 1]

a = input()
b = input()
res = ""

# 아스키 코드를 활용하여 알파벳의 획수를 구하고, 이를 문자열로 바꾸어 더해준다.
for i in range(len(a)):
	res += str(hint[ord(a[i]) - 65]) + str(hint[ord(b[i]) - 65])
    
ans = ""

# res의 인접한 값들을 int 자료형으로 바꾸어 더한 뒤 다시 문자열로 바꿔서 1의 자리를 ans에 더해준다.
# 이를 res의 길이가 2가 될 때까지 반복
while len(res) != 2:
	for i in range(1, len(res)):
		ans += str((int(res[i]) + int(res[i-1])))[-1]
	
	res = ans
	ans = ""

print("%2s" % res)
profile
돌멩이도 개발 할 수 있다

0개의 댓글