본문 바로가기
소프트웨어공학/코딩 테스트

코테에 도움되는 스킬들 for python

by javapp 자바앱 2022. 4. 1.
728x90

 

코테에 도움되는 스킬들 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)

 


 

 

입력 받기

 

 

용감하게 시작하는 코딩테스트

 

 

 


 

 

자료구조

 

리스트

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]       #역출력 활용

펠린드롬 수 이용

 


정규식

 

07-2 정규 표현식 시작하기

[TOC] ## 정규 표현식의 기초, 메타 문자 정규 표현식에서 사용하는 메타 문자(meta characters)에는 다음과 같은 것이 있다. > ※ 메타 문자란 원래 ...

wikidocs.net

 

 

팰린드롬 수

 

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 그래프

 

 

 

1026번: 보물

첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거

www.acmicpc.net

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)]))

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

댓글