2 분 소요

사용 언어: Python3

문제

백준 17269

스크린샷 2023-03-10 오후 3 47 06

코드

내 풀이

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]))


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기