코테에 도움되는 스킬들 for python
나눗셈 //
5//3 >>> 1
객체 복사
.copy() # 명시적 표현
import copy
a= [1,2, [3,5], 4] # 복잡한 중첩 리스트인 경우
b= copy.deepcopy(a)
스왑
a=1
b=2
a, b = b, a
print(a, b)
최대 최소 초기화
import sys
mx = -sys.maxsize
mn = sys.maxsize
범위 있을 경우 맞춰서
0(mn) < n < 5000(mx)
조건
if i in "aeiou":
cnt+=1
yield
def generator():
yield 1
yield 'string'
yield True
gen = generator()
print(next(gen))
print(next(gen))
1
string
range(n)
a = [ n for n in range(100) ]
b = range(100)
a 는 미리 값 생성 (메모리 점유 상태)
b 는 조건만 존재, 실행시 메모리 점유
f-string
출력 속도 빠름
print(f'{dix+1} : {fruit}')
포멧 대체
pprint
자동 줄바꿈
import pprint
pprint.pprint(locals()) # 로컬 스코프에 선언된 모든 변수를 조회
타입 힌트
def fn(a : int) -> bool :
파이썬은 동적 타이핑 언어
함수 기본 값 [], {} 지양
def foo(a, b=None):
def foo(a, b: Optional[Sequence]= None):
if not users: #if len(users) == 0 대체
if foo==0
enumerate
인덱스와 함께 반환
인덱스로 키 값 역할, 자리 기억해야할 때
list_ = [100, 200, 300, 45, 200]
for i , num in enumerate(list_):
print(i, num)
print(list(enumerate(list_)))
# [(0,100), (1,200), (2,300), (3,45), (4,200)]
print(list(enumerate(list_, start=10)))
zip
a= [1,2,3,4,5]
b= [2,3,4,5]
c= [3,4,5]
list(zip(a,b,c))
list(zip(a,b,c))[0]
# [(1, 2, 3), (2, 3, 4), (3, 4, 5)]
# (1, 2, 3)
입력 받기
나누어 입력받기¶
1 2
a,b = map(int, input().split())
행렬 입력¶
3
1 2 3
4 5 6
7 8 9
MAP = [list(map(int, input().split())) for _ in range(int(input()))]
MAP
3 1 2 3 4 5 6 7 8 9
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
정수와 배열이 같은 줄에 들어오는 경우¶
4 10 20 30 40
3 7 5 12
3 125 15 25
N, *arr = map(int, input().split())
4 10 20 30 40
N, arr
(4, [10, 20, 30, 40])
3
AAAA
ABCA
AAAA
MAP2 = [list(input()) for _ in range(int(input()))]
MAP2
3 AAAA ABCA AAAA
[['A', 'A', 'A', 'A'], ['A', 'B', 'C', 'A'], ['A', 'A', 'A', 'A']]
배열을 연결해서 출력 1¶
arr = [1,2,3,4]
result = ''.join(map(str,arr)) # str 이여야 됨
result
'1234'
print(*arr)
1 2 3 4
정수¶
- 최대 최소
import sys
ans = sys.maxsize
ans
9223372036854775807
# 2진수
print(bin(42))
# 8진수
print(oct(42))
# 16진수
print(hex(42))
0b101010 0o52 0x2a
# 10진수로 변환
int('0b111100', 2)
60
문자열 거꾸로¶
alph = "abcd"
alph[::-1]
'dcba'
# 아스키 코드
ord('a')
97
# 아스키코드 -> 문자
chr(97)
'a'
배열 초기화¶
배열 초기화는 그래프 문제를 해결할 때 밥먹듯이 사용. 초기화 형태를 기억
N, M = map(int , input().split())
arr = [[0] * N for _ in range(M)]
arr
2 2
[[0, 0], [0, 0]]
배열 원소 거꾸로¶
arr2=[4,3]
arr2.reverse()
arr2
[3, 4]
# 2588
a = int(input())
b = int(input())
arr_b = [int(i) for i in str(b)]
arr_b.reverse()
# for i in range(2, -1 ,-1):
for i in range(3):
print(a * arr_b[i])
print(a*b)
3 1234 12 9 6 3702
찾는 값의 원소 갯수¶
list.count(찾는 값)
str.count(찾는 값)
# 2490
n = 3
def check(arr):
count_zero = arr.count(0)
if count_zero == 0:
print('E')
elif count_zero == 1:
print('A')
elif count_zero == 2:
print('B')
elif count_zero == 3:
print('C')
else:
print('D')
for i in range(3):
MAP = list(map(int, input().split()))
check(MAP)
import sys
#input() 대신에 ->
for line in sys.stdin: # 전체를 받아서 한 라인씩
input() --> sys.stdin.readline()
File "<ipython-input-29-d899febddf70>", line 6 input() --> sys.stdin.readline() ^ IndentationError: expected an indented block
print = sys.stdout.write
중복제거¶
lst = [[1,2], [1,2], [1]]
list(set(map(tuple,lst)))
[(1,), (1, 2)]
배열 정렬¶
arr.sort(key=lambda x: (x[0], x[1]) # 오름차순 arr.sort(key = lambda x : (-x[1], x[2], -x[3], x[0])) # 내림차순
arr =[]
for _ in range(int(input())):
arr.append(list(map(int, input().split())))
# 정렬
arr.sort(key=lambda x: (x[0], x[1]))
for a in arr:
print(f'{a[0]} {a[1]}')
1 1 3 2 1 1 3
a = 'a'
b = 'b'
res= a if a> b else b
print(res)
b
itertools 을 사용한 조합¶
from itertools import combinations
list(combinations([1,2,3,4],3)) # 중복없이 M개 고른수열, 순서 고려
itertools 을 사용한 순열¶
from itertools import permutations
print(list(permutations([1,2,3,4],3)))
빈도 계산 Counter¶
from collections import Counter
arr= [int(input()) for _ in range(10)]
frq = Counter(arr).most_common()
print(sum(arr) //10)
print(frq[0][0])
힙¶
- 최소힙, 최대힙
leftChild = parent 2
rightChild = parent 2
import heapq
heap= []
heapq.heappush(heap,3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 10)
heapq.heappush(heap, 5)
heapq.heappush(heap, 8)
heap
[1, 3, 10, 5, 8]
import sys , heapq
heap =[]
# -1 을 곱하여 최대 힙 구현, 작은 값이 루트로 가기 때문에
for i in range(int(sys.stdin.readline())):
N = int(sys.stdin.readline())* -1
if N == 0:
if len(heap) == 0:
print(0)
else :
print(heapq.heappop(heap)*-1)
else :
heapq.heappush(heap,N)
덱 deque¶
from collections import deque
deq = deque() # 덱 초기화
deq = deque([i for i in range(1,5)])
deq
deq.appendleft(10)
deq
deq.append(10)
deq
deq.pop() # popleft()
deq.rotate(-1) # 왼쪽 회전
deq
from collections import deque
n = int(input())
deq = deque([i for i in range(1,n+1)])
while len(deq) != 1:
deq.popleft()
deq.rotate(-1)
result = deq.pop()
result
실행 시간¶
import time
start_time = int(round(time.time() * 1000))
# func()
end_time = int(round(time.time()* 1000))
print(end_time -start_time)
자료구조
리스트
O(1) : len(), a[l], .append(e), .pop()
O(k) : a[i:j]
O(n) : .count(e), .index(e) .pop(0), def a[i], min(a) max(a), .reverse(), elem in a
O(nlogn) : .sort()
스택 활용
stack = [1,2,3]
# push
stack.append(4)
# pop
stack.pop()
# peek
stack[-1]
큐 활용
queue = [4,5,6]
# 추가
queue.append(7)
# 삽입
queue.insert(0,2)
# 삭제
queue.pop(0)
# front, rear
queue[0], queue[-1]
A synchronized queue class
멀티 쓰레딩(threading) 환경에서 사용되며, 내부적으로 라킹(locking)을 지원
from queue import Queue
que = Queue()
# 추가
que.put(1)
# 삭제
que.get()
PriorityQueue
O(log n) : put(), get()
from queue import PriorityQueue
que = PriorityQueue()
# que = PriorityQueue(maxsize=8)
# 추가
que.put(1)
# 삭제
que.get()
튜플 정렬 (우선순위, 값)
# 추가
que.put((3,'값1'))
# 삭제
que.get()[1]
데크 활용
from collections import deque
queue = deque([4,5,6])
# 추가
queue.append(1)
# deque([4, 5, 6, 1])
# 뒤쪽 pop
queue.pop # 1
# 앞쪽 추가
queue.appendleft(1) # deque([1, 4, 5, 6])
# 앞쪽 pop
queue.popleft()
set : 불변객체
a = {'a', 'b'}
tuple (튜플)
a = () , a = ('a', ) , t = 1,2,3,4
딕셔너리 / 맵
dic
a = {} , a = {‘key1’:’value1’, ‘key2’:’value2’}
if ‘key1’ in a: #’key1’을 가진 key가 있는 지
O(1) : len(a), a[key] , a[key] = value, key in a
for k,v in a.items():
스택 내 괄호 값 확인
# 딕셔너리
table = {
')': '(',
'}': '{',
']': '['
}
print(')' in table)
# True
defaultdic
키가 존재하지 않아도 추가 가능
선언 :
a = collections.defaultdict(int)
a['C'] += 1
dic으로 미리 값을 넣고 split 다중 변수 초기화
환율 = {"달러": 1167, "엔": 1.096, "유로": 1268, "위안": 171}
user = input("입력: ")
num, currency = user.split()
print(float(num) * 환율[currency], "원")
Counter 객체
# Counter 객체
import collections
a = [1, 2, 3, 4, 5, 5, 5, 6, 6]
b = collections.Counter(a)
# Counter({5: 3, 6: 2, 1: 1, 2: 1, 3: 1, 4: 1})
matrix = b.most_common((개수))
# [(5, 3), (6, 2), (1, 1), (2, 1), (3, 1), (4, 1)] #이차배열
matrix[0][0] # (5,3)
.most_common
문자열
배열 -> 문자열
''.join() #문자열 합치기
''.join(sorted(str))
대소문자 변경
.swapcase()
+ .upper() .lower)
조합
45개의 숫자 줏 6개를 선택하는 경우의 수
itertools.combinations(range(1, 46), 6)
import itertools
c= itertools.combinations(range(1, 46), 6)
print(list(c))
. . .(38, 40, 41, 42, 44, 45), (38, 40, 41, 43, 44, 45), (38, 40, 42, 43, 44, 45), (38, 41, 42, 43, 44, 45), (39, 40, 41, 42, 43, 44), (39, 40, 41, 42, 43, 45), (39, 40, 41, 42, 44, 45), (39, 40, 41, 43, 44, 45), (39, 40, 42, 43, 44, 45), (39, 41, 42, 43, 44, 45), (40, 41, 42, 43, 44, 45)]
문자열 뒤집기
함수 이용
a= ["h","e"]
def rever(s:[]) -> None:
s.reverse()
rever(a)
print(a)
# ['e', 'h']
슬라이싱
s[:] = s[::-1] #배열 뒤집어서 저장
# ['e', 'h']
s == s[::-1] #역출력 활용
펠린드롬 수 이용
정규식
팰린드롬 수
import re
def isPallindrome(s : str) -> bool:
s= s.lower()
print(s)
s= re.sub('[^a-z0-9]','',s)
print(s)
return s == s[::-1]
print(isPallindrome("race A car"))
# race a car
# raceacar
# False
데크 활용
from collections import deque
def isPalindrome(head:ListNode) -> bool:
dqueue = deque()
if not head:
return True
node = head
while node is not None:
dqueue.append(node.val)
node = node.next
while len(dqueue) > 1:
if dqueue.popleft() != dqueue.pop():
return False
return True
*리스트 컴프리헨션
빈도수 높은 단어 추출
paragraph = "Bob hit a ball, the hit BALL flew far after ir was hit."
banned = ['hit']
# 단어 문자 아닌 것은 ' ' (공백으로 치환) 하고 소문자로 변경후 , banned가 아닌 것이 리스트로 반환
words = [ word for word in re.sub(r'[^\w]', ' ', paragraph).lower().split()
if word not in banned]
print(words)
# 결과
# ['bob', 'a', 'ball', 'the', 'ball', 'flew', 'far', 'after', 'ir', 'was']
*.split() #공백 기준 분리
컴프리헨션 조건
a = [1, -5, 4, 2, -2, 10]
b = [x for x in a if x < 0 ]
print(b)
# [-5, -2]
컴프리헨션으로 일치된 값 있는 개수 세기
J = 'aA'
S = 'aAAAAABB'
[s for s in S]
# ['a', 'A', 'A', 'A', 'A', 'A', 'B', 'B']
[s in J for s in S]
#[True, True, True, True, True, True, False, False]
sum([s in J for s in S])
# 6
여러가지 정렬방법
sorted 함수 #문자열을 리스트로
str = 'asdf'
print(sorted(str))
# ['a', 'd', 'f', 's']
Sort 배열 메소드
letters = ['let1 art can','let2 own kit dig', 'let3 art zero']
#2번째 절을 정렬, 같을경우 맨앞 기준으로 정렬
letters.sort(key=lambda x : (x.split()[1:], x.split()[0]))
print(letters)
letters.sort(key=lambda x : (x.split()[1:], x.split()[0]),reverse=True)
print(letters)
# 결과
# ['let1 art can', 'let3 art zero', 'let2 own kit dig']
# ['let2 own kit dig', 'let3 art zero', 'let1 art can']
정렬 기준
key : 키 또는 함수를 별도로 지정 (len .. )
sorted([], key=len)
list = ['cde', 'cfc', 'abc']
sorted(list, key=lambda str: (str[0], str[-1])) #첫 문자열 기준 -> 마지막 문자열 기준
# ['cde', 'cfc', 'abc']
튜플 정렬
tuple_list.sort(key=lambda x : (x[0], x[1])) # '-'부호를 이용해서 역순으로 가능
[('good_morning', 3), ('niceday', 1), ('niceday', 5), ('좋은하루', 0), ('좋은하루', 5)]
유클리드 호제법
# 유클리드 호제법
def gcd(a, b):
if b == 0: return a
else: return gcd(b, a%b)
# main
n = int(input())
for _ in range(n):
a, b= map(int, input().split(' '))
GCD = gcd(a,b)
LCM = int(a*b/GCD)
print(LCM,GCD)
그리디 알고리즘
가장 큰 순서대로
가장 작은 순서대로
정렬 알고리즘과 짝을 이뤄 출제
문제 유형 파악 어려우면 그리디 - 해결할 수 없다면 다이나믹 프로그래밍 or 그래프
n = int(input())
list_a = sorted(map(int,input().split(' ')))
list_b = list(map(int,input().split(' ')))
sum = 0
for a in list_a:
mb = max(list_b)
sum += a*mb
list_b.remove(mb)
print(sum)
다른 방법
N = int(input())
A = sorted(map(int, input().split()))
B = sorted(map(int, input().split()), reverse=True)
print(sum([a*b for (a, b) in zip(A, B)]))
댓글