전전 공댕이의 공부 기록
[파이썬을 파이썬답게] Part 2. 몫과 나머지 (divmod), n진법 string을 10진법 숫자로 변환하기 (int) 본문
[파이썬을 파이썬답게] Part 2. 몫과 나머지 (divmod), n진법 string을 10진법 숫자로 변환하기 (int)
Ashton 2021. 10. 31. 17:382-1 몫과 나머지 (divmod)
2-2 n진법 string을 10진법 숫자로 변환하기 (int)
2-1 몫과 나머지 (divmod)
문제 설명
숫자 a, b가 주어졌을 때 a를 b로 나눈 몫과 a를 b로 나눈 나머지를 공백으로 구분해 출력해보세요.
예시
입력: 5 3
출력: 1 2
My Solution
a, b = map(int, input().strip().split(' '))
m = int(a / b)
n = a % b
print(m, n)
다른 방법
a = 7
b = 5
print(a//b, a % b)
//
/와 //의 차이는, /는 답을 float로, //는 답을 int로 리턴한다는 점이다.
>>> 10/3
3.3333333333333335
>>> 10//3
3
더 파이썬다운 방법
a = 7
b = 5
print(*divmod(a, b))
# 1 2
divmod(a,b)
숫자 2개를 받아 나누고, 몫과 나머지를 tuple로 반환한다.
*, 즉 asterisk는 컨테이너 타입의 데이터를 Unpacking할 때 쓰인다.
따라서, divmod(a,b)의 출력은 튜플인 (a,b)인데, 이를 해체하기 위해 앞에 *를 붙여
*divmod(a,b)를 쓰게 되면, 출력은 a b가 나오는 것이다.
이는 튜플 뿐만 아니라 리스트에도 적용이 가능하다.
무조건 divmod를 사용하는 것이 좋은 방법은 아니고,
가독성/팀의 코드 스타일에 따라, 혹은 작은 숫자를 다룰 때는 a//b, a%b가 더 좋을 수 있다.
큰 숫자를 다룰 땐 divmod가 더 빠르다고 한다.
2-2 n진법 string을 10진법 숫자로 변환하기 (int)
문제 설명
base 진법으로 표기된 숫자를 10진법 숫자 출력해보세요.
입력 설명
입력으로는 공백으로 구분된 숫자가 두 개 주어집니다.
첫 번째 숫자는 num을 나타내며, 두 번째 숫자는 base를 나타냅니다.
출력 설명
base 진법으로 표기된 num을 10진법 숫자로 출력해보세요.
예시
input | output |
12 3 | 5 |
444 5 | 124 |
My Solution
뭔가 자랑스러운 답은 아니지만..최대한 답을 내는 것을 목표로 문제를 풀었다ㅎㅎ..
num, base = map(int, input().strip().split(' '))
final = []
i = 0
sum = 0
for _ in str(num):
length = len(str(num))
times = base**(length-1-i)
digit = int(_) * times
final.append(digit)
i += 1
for one in final:
sum += one
print(sum)
O(N)인 것 같은데 그래도 중복 for문이 안 들어가서 다행이고..
뭔가 굉장히 쉬운 문제를 내가 엄청 어렵게 푼 느낌..?
다른 방법
역시 파이썬이 아니더라도 더 짧은 방법이 있었는데 내가 너무 길게 끌어버린..ㅋㅋ큐ㅠㅠ
num = '3212'
base = 5
answer = 0
for idx, number in enumerate(num[::-1]):
answer += int(number) * (base ** idx)
enumerate
순서가 있는 자료형을 받아 각 값의 인덱스와 원소를 동시에 리턴한다.
enumerate : 열거하다
좀 더 파이썬답게 인덱스와 원소를 동시에 접근할 수 있는 방법이다.
파이썬의 내장 함수이고, 인덱스와 원소로 이루어진 터플(tuple)을 만들어준다.
순서가 있는 자료형, 즉 리스트, set, 튜플, 딕셔너리, string을 받아 인덱스값과 값을 함께 리턴한다.
인덱스와 원소를 각각 다른 변수에 할당하고 싶다면 unpacking을 해주면 되고,
인덱스가 0부터 시작하는 것이 아니라 특정 숫자에서 시작하게 하기 위해서는 자료형 뒤에 , start = "#"를 추가하여 #에 숫자를 써주면 된다.
풀이 설명
for idx, number in enumerate(num[::-1]):
num[::-1] -> 처음부터 끝까지 -1칸 간격으로 ( = 역순으로)따라서 num을 뒤에서부터 불러오고, idx에 인덱스를, number에 값을 저장한다.
answer += int(number) * (base ** idx)
base에 idx, 즉 인덱스 값만큼 거듭제곱을 한 후 그 자리의 값에 곱해준다.
이 방식을 num의 각 자리마다 반복한다.
Points to Remember
- You can do num[ : :-1] to a num that is a string
- You can add strings WHY DO I FORGET
num = "23424"
backwards = ""
for i in num[::-1]:
backwards += i
print(backwards)
# 42432
생각해보니 그러면 reverse string 함수를 이렇게 적을 수 있다..나는 왜 오늘 이전에 이상하고 어렵게 reverse string 구현 문제를 풀었는가..ㅋㅋ큐ㅠㅠㅠㅠ
더 파이썬다운 방법
num = '3212'
base = 5
answer = int(num, base)
int(x, base)
숫자 2개를 받아 진법 변환을 편리하게 해준다.
파이썬에서 지원하는 int 함수로, 이 함수를 쓰면 바로 진법 변환을 할 수 있다.
'Python > 알고리즘' 카테고리의 다른 글
[파이썬을 파이썬답게] Part 3. 문자열 정렬하기 (ljust, center, rjust), 알파벳 출력하기 (string 모듈) (0) | 2021.10.31 |
---|---|
[파이썬을 파이썬답게] Part 1. 시작! (0) | 2021.10.30 |
[프로그래머스 강의] 파이썬을 파이썬답게 수강 시작! (0) | 2021.10.27 |