2023. 10. 23. 21:33ㆍ파이썬(Python)
1. 2진법으로 표현하기
- 숫자를 2로 나누어 몫과 나머지를 구한다.
- 몫을 계속 2로 나누고 몫이 1일 때 1부터 지금까지 구한 나머지를 거꾸로 순서대로 적는다.
- 예를 들어, 50의 2진법을 구한다면 다음과 같다.
- 따라서 50을 2진법으로 표현하면 110010이 된다.
- 코드로 표현하면 다음과 같다.
n = int(input())
binary = []
while n >= 2:
binary.append(n % 2)
n //= 2
binary.append(n)
print(''.join(map(str, binary[::-1])))
>> 50
110010
- n을 2로 계속 나누어 나머지를 binary 리스트에 저장한다.
- n을 2로 나눈 몫으로 갱신하고 n이 1이 될 때까지 반복한다.
- n=1이 되면 n을 binary에 저장한다.
- 역순으로 출력해야 하므로 리스트를 뒤집는다.
- 리스트의 원소를 합치므로 join을 사용한다.
- 단, join은 원소가 문자열 형태여야 하므로 map을 사용하여 int인 원소를 str로 바꾼다.
2. 10진법으로 표현하기
- 만약 2진법 110010을 10진법으로 표기한다면 어떻게 해야 할까?
- 10진법에서 2진법을 구할 때는 계속 2로 나누었다.
- 2진법에서 10진법은 이를 반대로 2를 곱하고 2진법의 각 index의 값을 더하여 구할 수 있다.
- 이를 코드로 작성하면 다음과 같다.
n = list(map(int, list(input())))
num = 0
for i in n:
num = num*2+i
print(num)
>> 110010
50
- 입력한 2진수인 n을 원소가 1개인 리스트로 표현한다.
- 초기 10진수를 0으로 설정한다.
- 리스트를 순회하며 10진수에 2를 곱해 각 자리의 2진수를 더하여 10진수를 갱신한다.
Q) 정수를 n진법으로 변환
- 변환할 정수 m과 진법 n을 입력한다.
- n진법을 출력한다.
num, n = map(int, input().split())
arr = []
while num >= n:
arr.append(num % n)
num //= n
arr.append(num)
print(''.join(map(str, arr[::-1])))
>> 100 7
202
- num을 n으로 계속 나누어 나머지를 arr 리스트에 저장한다.
- num은 n으로 나눈 몫으로 갱신하고 num이 n보다 작으면 반복문을 탈출하고 num을 리스트에 저장한다.
- 역순으로 배열하여 리스트 내의 원소를 합친다.
Q) a진수에서 b진수로 변환
- a진수인 n을 b진수로 변환을 하자.
- 예를 들어, 123 5 7이라고 입력을 하면 5진법인 123을 7진법으로 변경하라는 의미이다.
n, a, b = map(int, input().split())
arr = list(map(int, list(str(n))))
num = 0
for i in arr:
num = num*a+i
arr2 = []
while num >= b:
arr2.append(num % b)
num //= b
arr2.append(num)
print(''.join(map(str, arr2[::-1])))
>> 123 5 7
53
- a진법인 n을 10진법으로 변경 후 b진법으로 변환한다.
- n의 각 숫자를 리스트로 나타낸다. (arr)
- 반복문을 통해 10진법으로 표현할 num에 a를 곱하고 arr의 각 원소를 더한다.
- 10진법인 num을 다시 b진법으로 변환하여 답을 구한다.
Q) 진법 변환 확장하기
- 예를 들어 16진법인 AB는 10진법으로 변환하면 171(16*10+11 )이 된다.
- A는 10을 의미하고 11진법부터 사용한다. 또한 B는 11을 의미하고 12진법부터 사용한다.
- 입력은 'a진수에서 b진수로 변환' 문제와 동일하다.
def isError(a, n):
for i in n:
if not i.isdigit() and ord(i)-ord('A')+10 >= a:
return False
return True
def number_append(x):
if x >= 10:
arr.append(chr(x+ord('A')-10))
else:
arr.append(str(x))
while True:
n, a, b = input().split()
a, b = int(a), int(b)
if isError(a, n):
arr = []
num = 0
for i in list(n):
if i.isdigit():
num = num*a+int(i)
else:
num = num*a+ord(i)-ord('A')+10
print(num)
while num >= b:
number_append(num % b)
num //= b
number_append(num)
print(''.join(arr[::-1]))
break
else:
print('input Error')
>> AB 16 8
253
>> CG 16 8
input Error
>> CF 16 8
207
317
- 입력 n, a, b는 a진수인 n을 b진수로 변환하는 것을 의미한다.
- a, b는 정수형으로 변환한다.
- isError 함수는 입력이 바르게 되었는지 확인하기 위한 함수이다.
- 예를 들어, 16진법은 0~9, A~F까지 16 종류의 수와 문자를 사용할 수 있다.
- 만약 CG라면 G는 16을 의미하고 범위 밖의 수이므로 input Error 메시지를 출력하고 다시 입력하게 한다.
- 현재 문자열 형태인 n을 순회하며 문자 1개의 아스키코드를 구한다. (ord(i))
- 문자열을 값으로 정의하기 위해 ord(i)-ord('A')+10을 정했고 이 값이 현재 진법 a 이상이면 False를 반환한다.
- 예를 들어, 문자열 D면 A에서 D까지 3칸이므로 13이 되고 14진법 이상에서 사용할 수 있다.
- 따라서 a가 13진법 이하면 사용할 수 없다.
- 10진법으로 변환하는 과정에서 반복문의 순회를 통해 각 원소가 숫자이면 a를 곱해 각 원소를 더한다.
- 만약 원소가 문자열이면 a를 곱해 원소의 아스키코드를 구해 A의 아스키코드를 빼서 10을 더한다.
- 이를 b진법으로 변환하기 위해 number_append 함수를 정의한다.
- number_append는 10진법인 num을 b로 나눠 나머지를 배열에 저장하는 함수이다.
- 만약 나머지가 10 이상이면 나머지에 10을 빼서 A의 아스키코드를 더한 값의 아스키코드를 구한다.
- chr을 이용해 문자열로 변환 후 배열에 저장한다.
- join을 이용해 배열 내의 원소를 합쳐 답을 구한다.
'파이썬(Python)' 카테고리의 다른 글
[Python] 사각형 넓이 문제 - 이중 배열 이용. 겹치는 영역. 겹치지 않는 영역. 최소 사각형 넓이 (0) | 2023.11.04 |
---|---|
[Python] 특정 구간의 개수 구하기 - 겹치는 지점, 겹치는 구간 (0) | 2023.10.29 |
[Python] 시간과 날짜, 요일 구하기 (0) | 2023.10.20 |
[Python] - 객체 정렬, 등수 표현, 객체 정렬 문제 풀이 (정보 정렬, 좌표 거리, 정렬된 위치 탐색) (0) | 2023.09.22 |
[Python] 우선 순위 객체 정렬, 다양한 조건의 객체 정렬 - class, tuple, lambda, cmp_to_key (0) | 2023.09.14 |