본문 바로가기
Algorithm Problem Solving/BaekJoon

[BaekJoon] 백준 17269 이름궁합 테스트 (Python / 파이썬)

by ʚ⇜❅🎕̈❄⇝ɞ 2021. 8. 25.
728x90
반응형

BaekJoon 백준 17269 이름궁합 테스트 문제는 두 사람의 이름 알파벳을 대응하는 숫자로 바꾸고 각 숫자와 그 숫자의 오른쪽 숫자와 더하는 과정을 반복하여 숫자가 2개만 남았을 때 남은 숫자인 두 사람의 궁합을 구하여 출력하는 문제이다. 난이도는 Bronze 1이다.

 

BaekJoon 17269 이름궁합 테스트 문제 정보

출처

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

알고리즘 분류

- 문자열 string, 수학, 사칙연산, 구현

난이도

- 브론즈 1 / Bronze 1

 

이름궁합 테스트 문제 요약

  • 먼저 이름을 알파벳 대문자로 적는다. 각 알파벳 대문자에는 알파벳을 적는데 필요한 획수가 주어진다.
  • 두 사람의 이름을 알파벳 대문자로 표현한 뒤, 한 글자씩 번갈아가며 적는다.
  • 이름이 남을 경우엔 뒤에 남은 글자를 맨 뒤에 적는다.
  • 그러고 나서 알파벳을 대응하는 숫자로 바꾸고 각 숫자와 그 숫자의 오른쪽 숫자와 더한 것을 밑에 적는다.
  • 더한 숫자가 10이 넘을 경우엔 일의 자리 수만 남긴다.
  • 이 과정을 반복하여 숫자가 2개만 남았을 때 남은 숫자가 두 사람의 궁합이 좋을 확률이 된다.
  • 이름 A, B와 이름의 길이 N M을 입력받는다. (2 ≤ N, M ≤ 100) 
  • A B의 이름궁합이 좋을 확률을 %로 출력한다. 단, 십의 자리가 0일 경우엔 일의 자리만 출력한다. 

 

문제 풀이 과정

  1. 이름을 입력받고, 두 이름의 알파벳을 번갈아 저장한 뒤 남는 알파벳은 맨 뒤에 저장한다.
  2. 각 알파벳을 알파벳의 획 수로 변경하여 저장한다.
  3. 궁합 비교하는 함수를 정의한다.
  4. 각 숫자와 그 숫자의 오른쪽 숫자와 더한 것을 새로 저장한다. (10이 넘으면 일의 자리 수만 저장한다.)
  5. 숫자가 2개 남을 때까지 반복하여 재귀 함수를 호출한다.
  6. 숫자가 2개 남으면 궁합이므로 숫자 2개를 return 한다.
  7. 궁합의 십의 자리가 0일 경우엔 일의 자리만, 아니면 두 자리 모두 %를 붙여서 출력한다.

 

코드 및 설명
def compatibility(name, length):
    rst = [0] * (length - 1)
    # 각 숫자와 그 숫자의 오른쪽 숫자와 더하여 저장
    for i in range(length - 1):
        num = name[i] + name[i + 1]
        # 10이 넘으면 일의 자리 수만 남김
        if num >= 10:
            rst[i] = num - 10
        else:
            rst[i] = num
    # 숫자 2개 남을 때 까지 궁합 보기
    if len(rst) == 2:
        return rst
    else:
        return compatibility(rst, len(rst))


stroke = {'C': 1, 'G': 1, 'I': 1, 'J': 1, 'L': 1, 'O': 1,
          'S': 1, 'U': 1, 'V': 1, 'W': 1, 'Z': 1,
          'B': 2, 'D': 2, 'N': 2, 'P': 2, 'Q': 2,
          'R': 2, 'T': 2, 'X': 2, 'Y': 2,
          'A': 3, 'F': 3, 'H': 3, 'K': 3, 'M': 3, 'E': 4}

N, M = map(int, input().split())
A, B = map(list, input().split())

initial = []  # 초기 상태
# 이름 번갈아서 저장
for i in range(N if N < M else M):
    initial.append(A[i])
    initial.append(B[i])
if N > M:
    initial.extend(list(A[-(N - M)::]))
elif N < M:
    initial.extend(list(B[-(M - N)::]))

# 숫자로 변경
for i in range(N + M):
    initial[i] = stroke[initial[i]]

# 궁합 비교
ans = compatibility(initial, N + M)
if ans[0] == 0:
    print(f'{ans[1]}%')
else:
    print(f'{ans[0]}{ans[1]}%')

BaekJoon 백준 17269 이름궁합 테스트 문제를 파이썬 python으로 풀어보았다. 난이도는 Bronze 브론즈 1이다. 

728x90
반응형

댓글