220901에 보았던 코딩테스트 문제 4개 관련 코드 및 풀이
- 철수는 N(2<=N<=26)진법 수를 표현하는데 필요한 N개의 수를 서로 다른 임의의 소문자 알파벳들로 바꿔 표현하려고 합니다.
- 그러기 위해 각 수를 어떤 알파벳으로 표현할 것인지에 대한 규칙을 표로 만들어 보았습니다.
- 예를 들어,
5
진법 수를 아래와 같은 규칙으로 나타낸다고 하겠습니다.
- 위의 규칙을 적용하면
5
진수120
은otz
가 되고,5
진수33
은hh
가 됩니다.- 철수는 음이 아닌 두 개의
N
진수A
,B
(A
>=B
)를 자신만의 규칙으로 적었고,A - B
를 계산하고 싶습니다.- 규칙
rule
과 두 수A
,B
를 바꿔 표현한 값이 주어질 때, 철수의 규칙대로 나타낼 때의A - B
를return
하도록solution
함수를 완성해주세요.
(rule[i]
는 한 자릿수i
를 철수의 규칙으로 나타낸 값이며, 숫자는0
으로 시작하지 않습니다.)
- rule의 길이는 2이상 26이하입니다.
- A와 B의 길이는 1이상 10이하 입니다.
- rule, A, B는 알파벳 소문자만 포함합니다.
- A와 B에 포함되는 각 알파벳은 rule에 딱 한 번 등장합니다.
- 알파벳으로 나타내기 전의 A는 B보다 크거나 같습니다.
rule A B result zothf otz hh ht ab ba a ba
- 입출력 예 #1
- ..
- 입출력 예 #2
- ..
단계 | 요약 | 설명 |
---|---|---|
1단계 | N진법 문자 → N진법 숫자 | - 주어진 N진법의 문자 A, B를 각각 N진법의 숫자로 변환 - 변환 시, 각 자리 숫자를 리스트의 요소로 담음 |
2단계 | N진법 숫자 → 10진법 숫자 | - 앞에서 변환한 N진법 숫자 리스트를 이용하여 각각 10진법의 숫자로 변환 - 변환 시, 각 자리 숫자를 리스트의 요소로 담음 - 변환 시, 각 자리 숫자를 리스트의 요소로 담음 |
3단계 | 뺄셈 계산 | - sum(리스트)를 이용하여 각각에 대한 10진법의 수를 구하고 뺄셈을 진행 |
4단계 | 10진법의 수 → N진법 숫자 | - N으로 나눈 몫, 나머지를 이용하여 N진법 숫자로 변환 - 변환 시, 각 자리 숫자를 리스트의 요소로 담음 |
5단계 | N진법 숫자 → N진법 문자 | - 리스트 내의 숫자를 문자열 rule의 index로 활용하여 N진법 문자로 변환 |
def solution(rule, A, B):
num = len(rule)
listA = [rule.index(i) for i in A]
listB = [rule.index(j) for j in B]
lengA = len(A)
lengB = len(B)
listA1 = [listA[k]*(num**(lengA-1-k)) for k in range(lengA)]
listB1 = [listB[l]*(num**(lengB-1-l)) for l in range(lengB)]
A1 = sum(listA1)
B1= sum(listB1)
C1= A1-B1
if C1 == 0:
return rule[0]
else:
listC = []
while C1>0:
listC.insert(0, C1%num)
C1 = C1//num
lengC = len(listC)
C = ""
for i in listC:
C += rule[i]
return C
※ 잘 안보이는 경우, 그림 우클릭 → '새 탭에서 이미지 열기' 클릭하여 확인하면 됨!
예시에 대한 단계별 적용
단계별 코드 설명