[BOJ] 17269 - 이름궁합 테스트
사용 언어: Python3
문제
코드
내 풀이
def addNum(a, b):
return (a+b)%10
dict = {'A':3, 'B':2, 'C':1, 'D':2, 'E':4, 'F':3, 'G':1, 'H':3, 'I':1, 'J':1, 'K':3, 'L':1, 'M':3, 'N':2, 'O':1, 'P':2, 'Q':2, 'R':2, 'S':1, 'T':2, 'U':1, 'V':1, 'W':1, 'X':2, 'Y':2, 'Z':1}
N, M = map(int, input().split())
A, B = input().split()
lst_A = list(A)
lst_B = list(B)
merged = []
for i in range(max(N,M)):
if i < N:
merged.append(lst_A[i])
if i < M:
merged.append(lst_B[i])
numbers = [0 for i in range(N+M)]
for i in range(N+M):
numbers[i] = dict[merged[i]]
for i in range(len(numbers)-1):
addNum(numbers[i], numbers[i+1])
... 풀다가 포기ㅠ
다른 풀이
N, M = map(int, input().split())
A, B = input().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] # 어쩔 수 없이 하나씩 적어야 함. 종종 이런 문제 출제
merged = '' # type: string
minLen = min(N,M)
for i in range(minLen):
merged += A[i] + B[i]
merged += A[minLen:] + B[minLen:] # 둘 중 하나는 자동으로 빈 문자열이 된다
numbers = [alp[ord(i)-ord('A')] for i in merged] # list comprehension 으로 간단하게! # ord() 사용하기!
for i in range(N+M-2): # 최종 결과로 길이가 2가 남아야 하니까 (전체 길이 - 2)
for j in range(N+M-1-i): # 각각의 길이만큼
numbers[j] += numbers[j+1] # 하나씩 앞으로 밀어준다고 생각!
numbers[j] %= 10 # 두 자리라면 일의 자리만
print("{}%".format(numbers[0]*10 + numbers[1])) # 입출력 형식 지키키: __%
- 위 코드의 시간복잡도는
n^2
이 된다. format()
메서드로 입출력 형식을 지키자.
또 다른 풀이
# ✅ 주어진 규칙을 한 번 적용한 상태를 반환하는 함수
def apply(lst):
res = []
for i in range(len(lst)-1):
res.append((lst[i]+lst[i+1])%10)
return res
N, M = map(int, input().split())
A, B = input().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] # 어쩔 수 없이 하나씩 적어야 함. 종종 이런 문제 출제
merged = '' # type: string
minLen = min(N,M)
for i in range(minLen):
merged += A[i] + B[i]
merged += A[minLen:] + B[minLen:] # 둘 중 하나는 자동으로 빈 문자열이 된다
numbers = [alp[ord(i)-ord('A')] for i in merged] # list comprehension 으로 간단하게! # ord() 사용하기!
while len(numbers) > 2: # ✅ 최종 결과로 길이가 2가 남아야 한다
numbers = apply(numbers) # ✅ 규칙을 적용하는 함수를 i 번 호출
print("{}%".format(numbers[0]*10 + numbers[1]))
- 개인적으로 위 풀이보다 이게 더 이해가 쉬웠다!
0327 추가
N, M = map(int, input().split())
A, B = input().split()
dict = {
'A':3,
'B':2,
'C':1,
'D':2,
'E':4,
'F':3,
'G':1,
'H':3,
'I':1,
'J':1,
'K':3,
'L':1,
'M':3,
'N':2,
'O':1,
'P':2,
'Q':2,
'R':2,
'S':1,
'T':2,
'U':1,
'V':1,
'W':1,
'X':2,
'Y':2,
'Z':1
}
merged = list()
if min(N,M)==len(A):
shorter = A
longer = B
else:
shorter = B
longer = A
# 두 이름 합치기
for i in range(len(shorter)):
merged.append(A[i])
merged.append(B[i])
for i in range(len(shorter),len(longer)):
merged.append(longer[i])
# 알파벳 -> 획수
numCounts = list(0 for _ in range(N+M))
for i in range(len(merged)):
numCounts[i] = dict[merged[i]]
# 계산
for i in range(N+M-2):
for j in range(N+M-1-i):
numCounts[j] += numCounts[j+1]
numCounts[j] %= 10
# 출력
print("{}%".format(numCounts[0]*10 + numCounts[1]))
💛 개인 공부 기록용 블로그입니다. 👻