본문 바로가기

개발/Algorithm

코딩테스트를 위한 파이썬 TIPS

조금씩 추가할 예정입니다

지정한 우선순위로 Sort

sorted(list, key = lambda x : (x[3],x[1] ... ))

l=[[2,8], [1,3], [4,5],[2,7]]

# 일반 sort -> 첫 번째 요소를 기준으로 하고 첫 번째 요소가 같으면 두 번째가 기준이 됨
print(sorted(l))
# >>> [[1, 3], [2, 7], [2, 8], [4, 5]]

# 2번째 요소를 기준으로 sort
print(sorted(l, key = lambda x : (x[1], x[0])))
# >>> [[1, 3], [4, 5], [2, 7], [2, 8]]

# 오름차순, 내림차순
# -를 붙이면, 현재 정렬 차순과 반대로 하게 된다
print(sorted(l, key = lambda x : (x[0], -x[1])))
# >>> [[1, 3], [2, 8], [2, 7], [4, 5]]

 

리스트 요소 하나하나씩 출력

print(*list)

# [1, 7, 9]를 1 7 9 로 출력하고 싶을 때
list=[1, 7, 9]
# [방법 1] end=' '
for i in range(n):
     print(list[i],end=' ')
# >>> 1 7 9

# [방법 2] Unpacking
# 함수에 각 인자로 하나하나 전달
# list 앞에 애스터리스크(*) 붙힘
# print(list[0], list[1], list[2]) 와 같은 효과
print(*list)
# >>> 1 7 9

 

전치행렬

l=[[1,2,3],
   [11,22,33]]
transposed_l =list(zip(*l))
# 전치행렬1 = list(zip(*이차원행렬))
for t in transposed_l:
    print(*t)
# >>>     1 11
#         2 22
#         3 33

 

재귀함수 제한 늘이기

import sys
sys.setrecursionlimit(10**6)

DFS시에 특히 반복적으로 함수를 부르는 것을 늘려야 될 경우가 있다

 

리스트 역순(reverse)

l='abcd'
li=[1,2,3,4,5,6]
print(l[::-1])
print(li[::-2])
#dcba
#[6, 4, 2]

이해가 되지 않으면 리스트 슬라이싱을 공부해야 한다.

 

itertools

  • 순열 : permutation
    • 순서를 고려하여 뽑는 경우의 수
  • 조합 : combination
    • 순서를 생각하지 않고 뽑는 경우의 수
  • 중복순열 : product
    • 같은 숫자를 중복하여 사용가능 -> n**r
  • 중복조합 : combinations_with_replacement
    • 같은 숫자를 중복하여 조합. 순서 고려
from itertools import permutations, combinations, product,combinations_with_replacement
n=2
iters=[['+', '-', ' '] for _ in range(n)]
candidates=list(product(*iters)) # = list(product(['+', '-', ' '] ,['+', '-', ' '] ,['+', '-', ' '] ))
print(candidates)
>>>[('+', '+'),
('+', '-'),
('+', ' '),
('-', '+'),
('-', '-'), 
('-', ' '),
(' ', '+'),
(' ', '-'),
(' ', ' ')]

*를 사용하면 product로 알아서 파라미터를 넣어주어 같은 코드를 반복해야 할 때 굉장히 유용하다

 

eval

함수의 파라미터를 실행한다. 함수도 실행한다

print(eval('1+3'))
print(eval('abs(-3)'))
>>>4
3

 

2차원 리스트 max

l = [
    [6, 8, 2, 6, 99],
    [3, 2, 3, 4, 6],
    [6, 7, 3, 3, 2],
    [7, 2, 5, 3, 6],
    [8, 9, 5, 2, 7]
]
print(max(l))
>>>[8, 9, 5, 2, 7]
print(max(max(l)))
>>>8

l에서 99를 찾고 싶었는데 8이 나왔다. 파이썬에서 max는  내부 요소들에 대해 최대값을 비교하는 것이 아니라, 각 행의 첫 번째 요소부터 순차적으로 비교하여 최대값을 가진 행을 반환한다고 한다.

 

max_value = max(max(row) for row in l)

이렇게 하면 max 값을 찾을 수 있다