문제
https://www.acmicpc.net/problem/2745
풀이
1번 풀이
Alphabet = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
N, B = input().split()
N = N[::-1] #앞자리부터 계산하기 위한 슬라이싱
B = int(B)
Num = 0 #10진수 변환값
for i in range(len(N)):
Num += Alphabet.index(N[i]) * (B ** i) #알파벳 리스트에서의 순서로 10진수로 변환
print(Num)
Alphabet 리스트에 0부터 Z까지 문자로 저장했음.
N을 인덱스 슬라이딩으로 뒤집고 차례로 배열에 인덱스를 불러와 계산함.
B의 i승으로 B진법 i자리의 값을 구할 수 있다는 놀라운 발상을 해서 뿌듯함.
(중등수학 배운 보람이 있음.)
2번 풀이
N, B = input().split()
N = N[::-1] #앞자리부터 계산하기 위한 슬라이싱
B = int(B)
Num = 0 #10진수 변환값
for i in range(len(N)):
ascii = ord(N[i]) #ord == string to askii
decimal = ascii-48 if ascii < 65 else ascii-55 #ascii 코드의 문자 '0' == 48, 문자 'A' == '65'이기에 각각 0, 10으로 만들었음.
Num += decimal * (B ** i)
print(Num)
Alphabet 리스트를 지움.
대신 ascii코드를 사용함.
입력값의 알파벳이 소문자였으면 좀 덜 짜증났을듯.
삼항연산자를 사용해서 숫자와 알파벳을 구분해 계산함.
시간복잡도가 크게 줄어든것만 같은 기분이 듦.
3번 풀이
N,B=input().split()
print(int(N,int(B)))
날먹ㅋ
알고는 있었지만... 다르게 푼건 푸는것이 목적이 아니구 학습이 목적이기 때문임.
삽질
이 문제는 딱히 코드의 변화는 없었음.
다만 1번풀이의 Alphabet 리스트에 W를 Y로 쓰는 바람에 한참을 헤맴.
그래서 풀고나서도 다른 풀이를 찾아봤고, 앞으로 1번과 같은 풀이는 지양해야겠음.
그리고 파이썬의 index함수는 꽤나 느린듯.
딕셔너리 자료형의 속도에 뿅가서 비슷한 방식으로 사용해봤는데 앞으로 그러면 안 될듯. (파이썬도 딕셔너리 있었음 좋겠음.)
정말 써야하는 상황이라면 리스트를 두 개 만들어서 딕셔너리 비슷하게 구현할 수 있을듯.
'Algorithm Study' 카테고리의 다른 글
백준 9506번 약수들의 합 (0) | 2024.02.18 |
---|---|
백준 27433번 팩토리얼 2 - Python (0) | 2024.02.18 |
백준 28215번 대피소 - Python (0) | 2024.02.18 |
백준 28214번 크림빵 - Python (0) | 2024.02.18 |
백준 2563 색종이 (Python) (0) | 2024.02.18 |
댓글