220902_프로그래머스 : 코딩테스트 문제3

Csw·2022년 9월 2일
1

TIL

목록 보기
6/18

220901에 보았던 코딩테스트 문제 4개 관련 코드 및 풀이

3. n진법의 수

문제 안내

상세 설명

  • 철수는 N(2<=N<=26)진법 수를 표현하는데 필요한 N개의 수를 서로 다른 임의의 소문자 알파벳들로 바꿔 표현하려고 합니다.
  • 그러기 위해 각 수를 어떤 알파벳으로 표현할 것인지에 대한 규칙을 표로 만들어 보았습니다.
  • 예를 들어, 5진법 수를 아래와 같은 규칙으로 나타낸다고 하겠습니다.
  • 위의 규칙을 적용하면 5진수 120otz가 되고, 5진수 33hh가 됩니다.
  • 철수는 음이 아닌 두 개의 N진수 A, B(A >= B)를 자신만의 규칙으로 적었고, A - B를 계산하고 싶습니다.
  • 규칙 rule과 두 수 A, B를 바꿔 표현한 값이 주어질 때, 철수의 규칙대로 나타낼 때의 A - Breturn하도록 solution 함수를 완성해주세요.
    (rule[i]는 한 자릿수 i를 철수의 규칙으로 나타낸 값이며, 숫자는 0으로 시작하지 않습니다.)

제한사항

  • rule의 길이는 2이상 26이하입니다.
  • A와 B의 길이는 1이상 10이하 입니다.
  • rule, A, B는 알파벳 소문자만 포함합니다.
  • A와 B에 포함되는 각 알파벳은 rule에 딱 한 번 등장합니다.
  • 알파벳으로 나타내기 전의 A는 B보다 크거나 같습니다.

입출력 예

ruleABresult
zothfotzhhht
abbaaba

입출력 예 설명

  • 입출력 예 #1
    • ..
  • 입출력 예 #2
    • ..

풀이 및 코드

풀이

로직 설명

  • 크게 나눠 5단계로 풀이 진행
단계요약설명
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진법 문자로 변환

코드 구현 및 라인별 풀이

Code
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
관련 풀이

※ 잘 안보이는 경우, 그림 우클릭 → '새 탭에서 이미지 열기' 클릭하여 확인하면 됨!

  • 예시에 대한 단계별 적용

  • 단계별 코드 설명

회고

  • 문제에서 글로 표현된 로직을 그대로 코드로 옮겨서 풀었기 때문에 1차원적인 풀이라고 생각되나, 당장 뭐 더 나은 풀이가 떠오르지 않아 그대로 진행하였음.
  • 20가지 테스트 케이스 중 하나에 대해 오류가 발생하였는데, 종이에 펜으로 예시들을 써가며 생각해보니 내가 작성한 코드 기준으로 두 문자열이 같은 경우에 대해 별도로 처리를 해주지 않으면 return 값이 빈 문자열로 나온다는 것을 발견!!
    → 예외 처리에 대한 코드 추가함으로써 100점 가득 찬 것을 확인

0개의 댓글