언어 제한 때문에 자바스크립트로 코딩테스트를 볼 수 없는 경우가 너무 많아서 파이썬 코딩테스트도 연습하기로 했습니다😂 (언어 여러 개 익히고 오히려 좋아~~ㅋㅎㅋㅎ)
저같은 경우가 많을 것 같아서 블로그를 작성하게 되었습니다 ㅎㅎ
제가 느끼기에 낯설었던 파이썬의 내장 함수, 조금씩 다른 문법 등을 문제와 함께 정리해두었으니, 서브 코테 언어를 준비하시는 분들께 도움이 되기를 바라봅니당 😎
또, 프로그래머스에서는 언어에서 파이썬 2와 파이썬 3을 선택할 수 있는데 저는 파이썬3
을 사용했습니다!
(파이썬 2는 2020년에 개발이 중지되었다고 합니당~ [Python] 파이썬 2와 파이썬 3의 차이점)
추천 참고 블로그: [Python] 코딩테스트에서 자주 사용되는 주요 라이브러리 | ⭐️ 코딩 테스트를 위한 파이썬 알고리즘 문법
클릭해서 문제 전체 보기🔼
import math
def solution(numer1, denom1, numer2, denom2):
denomGcd = math.gcd(denom1, denom2)
multiple1 = denom2 // denomGcd
multiple2 = denom1 // denomGcd
denom = denom1 * multiple1
numer = (numer1 * multiple1) + (numer2 * multiple2)
finalGcd = math.gcd(denom, numer)
return [numer // finalGcd, denom // finalGcd]
📢 풀이 설명
파이썬은 내장 함수가 잘 되어있어서 최대공약수
를 일일이 구현하지 않아도 된다.
미리 살펴보지 않고 냅다 구현하느라 시간을 많이 썼어요,, 내장 함수에 뭐가 있는지 잘 살펴보는 것도 중요함을 느꼈습니다 ^^...
math.gcd(숫자들)
: 최대공약수 함수, 입력받은 숫자들의 최대공약수를 반환함(정수 형태)
-> 파이썬 3.9 버전 이상만 1개 이하 혹은 3개 이상의 숫자들 가능 (3.8 이하는 인자 2개만 계산 가능, 프로그래머스 파이썬3은 2개만 가능해용 !)
math.lcm(숫자들)
: 최소공배수 함수, 입력받은 숫자들의 최소공배수를 반환함(정수 형태)
=> 인자 중 하나라도 0이면 0 반환
-> 파이썬 3.9 버전 이상에서만 지원함
import math
math.gcd(3, 6) #최대공약수인 3 반환
math.lcm(3, 6) #최소공배수인 6 반환
클릭해서 문제 전체 보기🔼
def solution(numbers):
return [number * 2 for number in numbers]
📢 풀이 설명
리스트 컴프리헨션
: [] 안에서 for문, if문을 사용해 조건을 만족하는 대상만 리스트로 생성하는 것# 단순 반복
[i for i in range(5)] # [0, 1, 2, 3, 4]
# 함수 넣기
def func(a):
a = print(a, "번째")
return a
[func(i) for i in range(5)] # [0 번째, 1 번째, 2 번째, 3 번째, 4 번째]
# if문 -> 조건문을 오른쪽에 씀, if문 여러 개 사용 가능
[표현식 for 항목 (in 반복가능객체) if문]
[i for i in range(5) if i % 2 == 0 if i % 4 == 0] # [0, 4]
# if- else문 -> 조건문을 왼쪽에 씀
[표현식 if-else문 for 항목 (in 반복가능객체)]
[i if i % 2 == 0 else "odd" for i in range(5)] # [0, "odd", 2, "odd", 4]
클릭해서 문제 전체 보기🔼
def solution(array):
if len(array) == 1:
return array[0]
uniqueArray = list(set(array))
if len(uniqueArray) == 1:
return array[0]
arrayCount = [[num, array.count(num)] for num in uniqueArray]
arrayCount.sort(key = lambda x: x[1], reverse = True)
return arrayCount[0][0] if arrayCount[0][1] != arrayCount[1][1] else -1
📢 풀이 설명
정렬의 2가지 방법
sorted(요소 배열)
: 원본을 바꾸지 않고 정렬한 값을 반환함
-> 리스트 뿐만 아니라 튜플, dict, str 모두 사용 가능
요소배열.sort()
: 원본 리스트 자체를 정렬하여 바꾸고, 반환값음 없음
이중 리스트에서의 정렬
# [[a1, b1], [a2, b2], [a3, b3]] 형태
array = [[1, "가"], [4, "다"], [3, "라"], [2, "나"]]
# `a(앞 인자)`를 기준으로 정렬
sorted(array, key = lambda x: x[0]) # [[1, "가"], [2, "나"], [3, "라"], [4, "다"]]
array.sort(key = lambda x: x[0]) # [[1, "가"], [2, "나"], [3, "라"], [4, "다"]]
# `b(뒷 인자)`를 기준으로 정렬
sorted(array, key = lambda x: x[1]) # [[1, "가"], [2, "나"], [4, "다"], [3, "라"]]
array.sort(key = lambda x: x[1]) # [[1, "가"], [2, "나"], [4, "다"], [3, "라"]]
[python] sorted(), sort(), key 사용법 | 파이썬 (Python) - (정렬 총정리) ~
클릭해서 문제 전체 보기🔼
from functools import reduce
def solution(numbers):
sum = reduce(lambda acc, cur: acc + cur, numbers)
return sum / len(numbers)
📢 풀이 설명 1
reduce(lambda acc, cur: (acc와 cur를 이용한 연산식), (반복할 배열), (초기값 => 필수 아님))
: 데이터 집합(리스트, 문자열, dict, ...) 요소들을 연산하여 누적된 값을 반환함from functools import reduce
array = [1, 3, 5, 7, 9]
reduce(lambda acc, cur: acc * cur, array, 1) # 945
def solution(numbers):
return sum(numbers) / len(numbers)
📢 풀이 설명 2
충격적 메서드를 봤다. 바로 sum.,,
reduce를 이용할 필요없이 그냥 sum 함수만으로도 총합을 구할 수 있다니... 너무 충격이다
sum(반복할 배열, (초기값 => 필수 아님))
: 숫자로만 이루어진 데이터 집합(리스트, 튜플)의 요소들을 모두 더한 값을 반환함array = [1, 3, 5, 7, 9]
sum(array) # 25
sum(array, 100) #125
클릭해서 문제 전체 보기🔼
def solution(n):
result = 0
for i in str(n):
result += int(i)
return result
📢 풀이 설명 1
이 문제에서 봐야할 포인트는 2가지라고 생각한다.
str
을 붙여서 문자열로 만들기iterable
한 데이터에서만 돌 수 있기 때문에 리스트, 문자열, 튜플 등 반복 가능한 데이터에서만 사용해야한다. 정수는 숫자 한덩어리이기 때문에 for을 쓸 수 없음 !int
를 붙여야함def solution(n):
return sum(int(i) for i in str(n))
📢 풀이 설명 2
다른 사람의 풀이를 보다가 더 간단히 작성할 수 있다는 걸 깨달았다. 파이선을 잘 쓰려면 진짜 내장함수를 야무지게 이용해야겠다 !!
클릭해서 문제 전체 보기🔼
def solution(slice, n):
dividing, remain = divmod(n, slice)
return dividing if remain == 0 else dividing + 1
📢 풀이 설명
divmod()
: 2개의 숫자를 매개변수로 받고, 몫과 나머지를 튜플로 반환함//
이나 %
보다 느림 (큰 숫자일 수록 유리함)클릭해서 문제 전체 보기🔼
def solution(my_string, n):
return "".join([i*n for i in my_string])
📢 풀이 설명
"구분자".join(리스트)
: 구분자를 기준으로 리스트를 연결시켜줌
arr = ["가", "나", "다"]
"".join(arr) # 가나다
"_".join(arr) # 가_나_다
"^^^".join(arr) # 가^^^나^^^다
클릭해서 문제 전체 보기🔼
def solution(array):
maxNum = max(array)
return [maxNum, array.index(maxNum)]
📢 풀이 설명
특정 문자의 첫 번째 idx 찾는 메서드
index(찾을 문자, (찾기 시작할 idx, 끝낼 idx))
: 찾을 문자의 첫 번째 idx를 반환함
-> 찾을 문자가 없는 경우 -1
반환
-> 문자열에서만 사용 가능 (리스트, 튜플, dict 사용 불가)
find(찾을 문자, (찾기 시작할 idx, 끝낼 idx))
: 찾을 문자의 첫 번째 idx를 반환함
-> 찾을 문자가 없는 경우 ValueError
에러 발생
-> 문자열, 리스트, 튜플에서 사용 가능 (dict 사용 불가)
특정 문자의 모든 idx 찾는 방법
- filter
메서드 사용
arr = [1, 2, 3, 1, 1, 4]
allIdx = list(filter(lambda x: arr[x] == 1, range(len(arr)))) # [0, 3, 4]
클릭해서 문제 전체 보기🔼
def solution(my_string):
return sum(int(i) for i in my_string if i.isdigit())
📢 풀이 설명
isdigit()
: 모든 문자열이 숫자로만 이루어져있는지 판단 후 불린값 반환-
, .
이런 기호들도 전부 문자로 판단하기 때문에 양의 정수만 가능```python
str = "123abc-45"
# 정의된 문자열 갖다 쓰기
str.isdigit() ## False
# 문자열 직접 쓰기
isdigit("1234567890") # True
```
클릭해서 문제 전체 보기🔼
def solution(cipher, code):
return "".join([i for idx, i in enumerate(cipher) if (idx + 1) % code == 0])
📢 풀이 설명 1
enumerate()
: 순서가 있는 데이터를 (idx, 값)
형태의 튜플로 반환함arr = [0, 1, 2]
list(enumerate(arr)) # [(0, 0), (1, 1), (2, 2)]
def solution(cipher, code):
return cipher[code-1::code]
📢 풀이 설명 2
다른 사람 풀이를 보다보니 [::] 형태가 있길래 찾아봤다. 알고보니 내가 슬라이싱이라고 알고 있던 것의 원본이었다..!
data.[start(기본값 0):stop(기본값 데이터 길이(크기)):step(기본값 1)]
: 일정한 간격으로 요소들을 선택
하는 슬라이싱 연산자
-> 각 요소들은 다 생략 가능 (생략되면 기본값 적용됨)
=> start에서부터 stop까지 step단위로 선택하겠다는 뜻
str = "0123456789"
str[1:8:3] # 147
str[:8:3] # 25, start 생략된 것
str[1::3] # 147, stop 생략된 것
str[1:7] # 123456, step 생략된 것
클릭해서 문제 전체 보기🔼
def solution(s1, s2):
return len(set(s1) & set(s2));
📢 풀이 설명
a | b
: A와 B의 합집합 (A U B)a & b
: A와 B의 교집합 (A n B)a - b
: A와 B의 차집합 (B - A도 가능)클릭해서 문제 전체 보기🔼
def solution(n, t):
return n << t
📢 풀이 설명
비트 쉬프트 연산
: 정수를 2배로 곱하거나 나누어 계산함
-> 컴퓨터는 2진수로 값이 저장되기 때문에, 비트를 왼쪽
/ 오른쪽
으로 밀면 값이 1/2배
/ 2배
됨
-> <<
: 2배, >>
: 1/2배 (반토막)
num = 10
num << 1 # 20, (10 * 2)임
num << 5 # 320, (10 * 2 * 2 * 2 * 2 * 2)임
num >> 1 # 5, (10 // 2)임
num >> 2 # 2, (10 // 2 // 2)임