코딩 감각을 다시 끌어올리기 위해 코딩테스트 공부를 시작했다. 늘 제일 자신 없고 스트레스 받아 하던 것이 코딩테스트인데, 당장 인터뷰 볼일이 없다고 하더라도 언젠가 이 두려움을 꼭 없애고 싶었다. 알고리즘 공부는 시작하고, 포기하기를 수십번도 반복했지만 그래도 집에 사놓은 책 한권은 꼭 완독해보고 싶었다. 수준을 급하게 올려야하는 목표가 있는 것이 아니기에 천천히… 오래 오래… 공부할 것😊ㅎㅎㅎ
책에서 문제 풀기에 앞서 프로그래머스 코딩테스트 입문(Lv 0) 100제로 일단 시작하는 것을 권하기에, 지난 한달간 100제를 모두 풀었다. 그 과정에서 필요했던 Python 메소드와 함수를 정리해본다.
목차
최소 공배수, 최소 공약수
import math def solution(numer1, denom1, numer2, denom2): b = denom1 * denom2 a = (numer1 * denom2) + (numer2 * denom1) gcd=math.gcd(a,b) a = a // gcd b = b // gcd answer = [a, b] return answer
math.gcd
최대공약수math.lcd
최소공배수
기약분수
from fractions def solution(denum1, num1, denum2, num2): answer = fractions.Fraction(denum1, num1) + fractions.Fraction(denum2, num2) return [answer.numerator, answer.denominator]
fractions.Fraction
Fraction.numerator
분자,Fraction.denominator
분모
리스트의 개수 세기
ls = [1, 2, 1, 1, 1, 1] import collections cnt = collections.Counter(ls) print(cnt) print(cnt.most_common(1)) >>> Counter({1: 5, 2: 1}) [(1, 5)]
collections.Counter
약수 구하기
def getMyDivisor(n): divisorsList = [] for i in range(1, int(n**(1/2)) + 1): if (n % i == 0): divisorsList.append(i) if ( (i**2) != n) : # N=A*B일 때, A==B일 수 있기 때문에(eg.25=5*5) 중복 방지 divisorsList.append(n // i) divisorsList.sort() return divisorsList
n**(1/2)
제곱근math.sqrt(n)
대체 가능
소수 찾기
import math def is_primenum(x): for i in range(2, int(math.sqrt(x) + 1)): if x % i == 0: return False return True
- 1과 자기자신을 제외한 약수가 존재하는지 확인하려면, 약수들은 대칭적으로 짝을 이루기 때문에 자기자신의 제곱근(루트)까지만 확인
- N = A * B (A, B 짝을 이룸)
- 합성수: 소수가 아닌 수
소인수 찾기
def solution(n): answer = [] d = 2 while d <= n: if n % d == 0: n /= d if d not in answer: answer.append(d) else: d += 1 return answer
- 소인수분해: 어떤 수를 소수들의 곱으로 표현
순열과 조합
from itertools import * dataset = ['A', 'B', 'C'] printList = list(permutations(dataset, 2)) print(printList) # 결과값 # [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')] dataset = ['A', 'B', 'C'] printList = list(product(dataset, repeat = 2)) print(printList) # 결과값 # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')] dataset = ['A', 'B', 'C'] printList = list(combinations(dataset, 2)) print(printList) # 결과값 # [('A', 'B'), ('A', 'C'), ('B', 'C')] dataset = ['A', 'B', 'C'] printList = list(combinations_with_replacement(dataset, 2)) print(printList) # 결과값 # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
itertools.permutations
- 순열: 순서는 있으나 중복 없는 모든 경우의 수
itertools.product
- 중복 순열: 중복을 허용하는 순열
itertools.combinations
- 조합: 순서 상관 없는 경우의 수
itertools.combinations_with_replacement
- 중복 조합: 중복 포함, 순서를 고려하지 않는 경우
조합과 팩토리얼(숫자 리턴)
import math # 조합 balls = 5 share = 2 def solution(balls, share): return math.comb(balls, share) # 팩토리얼 math.factorial(balls)
math.comb
조합math.factorial
팩토리얼
문자열의 숫자 판별
.isdigit()
- 숫자, 지수까지
.isdecimal()
- 0~9사이의 숫자로만 이루어진, 1234 ⇒ True
.isnumeric()
- 숫자, 분수, 지수까지
*소숫점과 음수는 전부 취급 안하므로, replace 후에 사용해야 함
float의 정수 판별
- float(x).is_integer()
절대값
abs
대소문자 관련
def solution(my_string): answer = '' for s in my_string: if s.isupper(): answer += s.lower() else: answer += s.upper() return answer
집합
집합 연산
>>> a = {1, 2, 3, 4} >>> b = {3, 4, 5, 6} >>> a | b {1, 2, 3, 4, 5, 6} >>> set.union(a, b) {1, 2, 3, 4, 5, 6} >>> a & b {3, 4} >>> set.intersection(a, b) {3, 4} >>> a - b {1, 2} >>> set.difference(a, b) {1, 2} >>> a ^ b {1, 2, 5, 6} >>> set.symmetric_difference(a, b) {1, 2, 5, 6}
- ^ 연산자는 대칭차집합(symmetric difference)을 구하며 XOR 연산자 ^를 사용
- 대칭차집합은 XOR 연산자의 특성을 그대로 따르는데 XOR은 서로 다르면 참, 따라서 집합에서는 두 집합 중 겹치지 않는 요소만 포함
집합의 update 연산
>>> a = {1, 2, 3, 4} >>> a |= {5} >>> a {1, 2, 3, 4, 5} >>> a = {1, 2, 3, 4} >>> a.update({5}) >>> a {1, 2, 3, 4, 5} >>> a = {1, 2, 3, 4} >>> a &= {0, 1, 2, 3, 4} >>> a {1, 2, 3, 4} >>> a = {1, 2, 3, 4} >>> a.intersection_update({0, 1, 2, 3, 4}) >>> a {1, 2, 3, 4} >>> a = {1, 2, 3, 4} >>> a -= {3} >>> a {1, 2, 4} >>> a = {1, 2, 3, 4} >>> a.difference_update({3}) >>> a {1, 2, 4} >>> a = {1, 2, 3, 4} >>> a ^= {3, 4, 5, 6} >>> a {1, 2, 5, 6} >>> a = {1, 2, 3, 4} >>> a.symmetric_difference_update({3, 4, 5, 6}) >>> a {1, 2, 5, 6}
부분집합
>>> a = {1, 2, 3, 4} >>> a <= {1, 2, 3, 4} True >>> a.issubset({1, 2, 3, 4, 5}) True >>> a = {1, 2, 3, 4} >>> a < {1, 2, 3, 4, 5} True
상위집합
>>> a = {1, 2, 3, 4} >>> a >= {1, 2, 3, 4} True >>> a.issuperset({1, 2, 3, 4}) True >>> a = {1, 2, 3, 4} >>> a > {1, 2, 3} True >>> a = {1, 2, 3, 4} >>> a == {1, 2, 3, 4} True >>> a == {4, 2, 1, 3} True
집합 겹치는 요소
>>> a = {1, 2, 3, 4} >>> a.isdisjoint({5, 6, 7, 8}) # 겹치는 요소가 없음 True >>> a.isdisjoint({3, 4, 5, 6}) # a와 3, 4가 겹침 False
sort, sorted의 key 활용
def solution(numlist, n): answer = sorted(numlist, key = lambda x:(abs(x-n), n-x)) return answer
- key의 값으로는 function이 와야 함
- e.g.
array.sort(key = lambda x:x[0])
- e.g.
array.sort(key=lambda x:len(x))
- n가지 요건이 있을 경우 튜플로 묶어서 여러 개를 써주면 됨
- e.g.
몫, 나머지 동시에 구하기
div, mod = divmod(n, 10)
이진수
def solution(bin1, bin2): a = int(bin1, 2) b = int(bin2, 2) answer = bin(a+b) return answer.replace("0b", "")