-
[Python] 파이썬 문제 해결 전략 (4)내일배움캠프/Python 2024. 7. 12. 21:27
오늘도 파이썬 코딩 문제 lv.0 30문제를 풀었습니다!
이번에는 꽤 괜찮은 문제 해결 전략을
많이 가져왔습니다.
최대공약수
유클리드 호제법을 사용하여 구할 수 있습니다.
처음보는 단어라서 어려워하실 필요없이
아래 과정을 그대로 따라해주시면 됩니다.
유클리드 호제법: a를 b로 나누고 나머지 r을 구합니다.
b를 r로 나누고 나머지 r1을 구합니다..
이 과정을 나머지가 0이 될 때까지 반복합니다.
마지막 나머지가 최대공약수입니다.
예를 들어 28과 12의 최대공약수를 구해봅니다.
1. 28을 12로 나누면 나머지는 16
2. 16을 12로 나누면 나머지는 4
3. 12를 4로 나누면 나머지는 0
따라서 28과 12의 최대공약수는 4입니다.
너무 아름답습니다..
어떻게 이럴 수가 있는지 궁금하신 분은
아래 블로그를 참고해주시면 됩니다.
블로그 주인분이 설명을 너무 잘해놓으셔서
이해하기 쉬울 겁니다!
증명:
https://dimenchoi.tistory.com/46
def gcd(a, b):
if a < b:
a, b = b, a
while b != 0:
a, b = b, a % b
return a최대공약수를 코드로 나타내면 위와 같습니다!
최소공배수
def lcm(a, b):
return a * b // gcd(a, b)최소공배수를 구하는 방법은 많이 간단합니다.
그냥 최소공배수를 구하고자하는 숫자 2개를 곱해주고
최대공배수로 나눠주면 됩니다.
최대공배수를 구해주는 함수를 위에서 만들었으니
그냥 함수를 불러와서 계산만 해주면 됩니다.
최대공약수 쉽게 구하기
위에서 설명드린 유클리드 호제법은
전공이 수학과이신 분들이 배우는 내용입니다.
이해가 쉽지 않을 수도 있습니다.
따라서 파이썬 내장 라이브러리를 통해
쉽게 구하는 방법도 가져왔습니다.
import math
def solution(n):
return (n * 6) // math.gcd(n, 6) // 6Math 라이브러리 이용해줍니다.
숫자1과 숫자2의 최대공약수는
gcd(숫자1, 숫자2)입니다.
최소공배수의 경우에는
lcm(숫자1, 숫자2)를 사용합니다.
map과 sum
map객체는 반복 가능한 객체로서
그 자체로 sum이 가능한 제너레이터라
list를 씌어주고 sum을 해줄 필요가 없습니다.
sum(list(map(~,~))) --- (x)
sum(map(~,~)) --- (o)
✨ 딕셔너리에 조건 넣기
def solution(log):
res=''
joystick=dict(zip([1,-1,10,-10],['w','s','d','a']))
for i in range(1,len(log)):
res+=joystick[log[i]-log[i-1]]
return resdef solution(rsp):
d = {'0':'5','2':'0','5':'2'}
return ''.join(d[i] for i in rsp)딕셔너리에 조건을 넣어서
문제를 풀고 싶은데
자꾸 생각이 나지 않아서
결국 더 복잡한 방법으로 풀게 됩니다..
이걸 보시는 분들도
문제를 푸실 때
잊지 않고 사용하셨으면 좋겠습니다.
✨ 변환표를 만들고 변환시키기
def solution(rsp):
return rsp.translate(str.maketrans('025', '502'))위 코드를 간략하게 해석해드리자면
Str.maketrans는 0은 5 2는 0 5는 2에 대응하는 변환표를 만듭니다.
그리고 translate를 사용하여 rsp에 해당 변환표를 사용하여 변환합니다
엄청납니다..
아주 쉽게 대응관계를 만들어주고
변환시켜줄 수 있습니다.
✨ 짝수, 홀수 인덱싱
def solution(num_list):
return max(sum(num_list[::2]), sum(num_list[1::2]))이것도 매우 유용합니다..
웹 스크래핑을 할 때
은근히 자주 쓰게 되는 식입니다.
리스트 비교연산자
리스트에서도 비교연산자를 사용할 수 있다는 사실...
저는 이제야 알았습니다...
def solution(date1, date2):
return int(date1 < date2)date1과 date2의 요소를 비교하고
date2가 date1보다 크면 true값을 반환합니다.
2차원 배열 만들 때 조심할 것
answer = [[0]*n]*n
위 2차원 배열은 행과 열의 개수가 같은 배열입니다.
겉으로 보기에는 다른 2차원 배열과 다를 바가 없어보이지만...
이렇게 만들게 되면 동일한 리스트 객체를 참조하는 리스트들의 리스트가 됩니다.
다시 말해 동일한 객체를 참조하는 것이기 때문에
하나가 바뀌면 나머지 모두 따라서 바뀝니다.
그래서 2차원 배열의 0행 1열만 1로 바꿔주려고 해도
1열이 모두 1로 바뀌어 버립니다.
따라서 2차원 배열을 만들 때
answer = [[0]*n for _ in range(n)]
이와 같이 리스트 컴프리헨션을 사용해줘야 합니다.
✨ 전치 행렬 만들기
전치 행렬은 행렬의 대각을 기준으로 대칭인 행렬입니다.
따라서 a[i][j] = a[j][i] 식을 만족합니다.
A와 A^T는 전치 관계입니다. 이제 이걸 코드로 작성하면..
def solution(arr):
return int(arr == list(map(list, zip(*arr))))이게 끝입니다.
간략하게 설명해드리자면
*arr은 행렬 arr의 각 행을 언패킹하여 zip 함수에 전달합니다.
zip 함수는 입력으로 받은 여러 iterable 객체에서 병렬로 요소를 하나씩 추출하여 튜플을 만듭니다.
예를 들어, arr가 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]라면
zip(*arr)는 [(1, 4, 7), (2, 5, 8), (3, 6, 9)]를 반환합니다.
✨ max의 기준을 key로 지정해줄 수 있음
길이 기준
A = max(words, key = len)
리스트의 2번 째 값을 기준으로
A = max(words, key = lambda x: [1])
딕셔너리의 값을 기준으로 키를 반환
A = max(sales_data, key = sales_date.get)
이번 주만 파이썬 200문제 가까이 푼 것 같습니다..
문제를 많이 풀고 다른 사람들의 풀이를 분석하다보니
실력이 어제오늘 다른게 체감됩니다..
많이 배운만큼 까먹지 않게
주말은 복습 위주로 공부해야겠습니다.
'내일배움캠프 > Python' 카테고리의 다른 글
[Python] 파이썬 문제 해결 전략 (5) (2) 2024.07.18 [Python] 정규표현식 (기초편) (0) 2024.07.15 [Python] 파이썬 문제 해결 전략 (3) (0) 2024.07.11 [Python] 파이썬 문제 해결 전략 (2) (0) 2024.07.10 [Python] 파이썬 문제 해결 전략 (1) (0) 2024.07.08