👋
안녕하세요~ 위대한 개취비입니다!
코딩테스트를 앞두고 준비에 박차를 가하고 계신가요? 🤗
이번 글에서는 코딩테스트 직전에 오신 여러분들을 위해 꼭 알아야 할 핵심 포인트들을 모아 치팅 페이퍼 형식으로 정리해 보았습니다. 이 치팅 페이퍼는 마지막 순간까지도 도움을 줄 수 있는 중요한 개념과 팁을 포함하고 있습니다. 잘 활용하셔서 좋은 결과 얻으시길 바랍니다!
코딩 테스트는 꾸준한 연습과 체계적인 준비가 필요하지만, 시간이 얼마 남지 않은 분들이 있을 수 있기 때문에... 혹은 경력 지원인데 갑작스럽게 코딩테스트를 보셔야 하는 분들을 위해 작성했습니다! 🚀
기본
0. dir - 자료구조 메소드 이름 기억 안 날 때
print(dir(set([])))
# ['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__',
# '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__',
# '__init_subclass__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__',
# '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__',
# '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__',
# '__sub__', '__subclasshook__', '__xor__',
# 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard',
# 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset',
# 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
1. 빠른 입출력
- 입출력 방식만 기본 방식에서 빠른 입출력으로 바꿔도 시간 효율성 문제가 해결되는 경우가 종종 있더라구요...😎
import sys
S = sys.stdin.readline().rstrip()
N = int(sys.stdin.readline().rstrip())
sys.stdout.write(S + "\n") # sys.stdout.write에는 print와 달리 뒤에 개행문자가 없다.
sys.stdout.write(str(N) + "\n")
# 매번 번거로운 입출력을 쉽게
input = sys.stdin.readline
print = sys.stdout.write
S = input().rstrip()
N = int(input().rstrip())
print(S + "\n")
print(str(N) + "\n")
2. filter
2-1. filter 함수 사용
nums = [3, 5, 4, 8, 9]
nums = list(filter(lambda n: n%2 != 0, nums))
print(nums) # [3, 5, 9]
2-2. List Comprehension 사용
nums = [3, 5, 4, 8, 9]
nums = [n for n in nums if n%2 != 0]
print(nums) # [3, 5, 9]
3. enumerate
String을 입력 받고 foreach 쓰면서도 index 살리고 싶을 때 사용한다.
for i, c in enumerate("abcde"):
print(f'{i}. {c}')
# 0. a
# 1. b
# 2. c
# 3. d
# 4. e
4. 반올림
- 중요!!!
round()
는 사사오입이 아니라오사오입
이다. - 사사오입이 필요한 경우,
int(x + 0.5)
를 활용하자.
print(round(0.4)) # 0
print(round(0.5)) # 0
print(round(0.6)) # 1
print(int(0.49 + 0.5)) # 0
print(int(0.5 + 0.5)) # 1
print(int(0.51 + 0.5)) # 1
5. 음수 나머지 연산
print(-1 % 10000) # 9999
print(-1 % 1) # 0
print(-1 % 5) # 4
문자열과 숫자
1. 숫자 각 자리의 합
I = 245
ans = sum(map(int, str(I)))
print(ans)
2. 입력이 문자인지 숫자인지 확인
S = input()
print(S.isdigit())
# "5" => True
# "haha" => False
3. format
format(1234567, ",") # 자리수 쉼표. 1,234,567
format(1234567, ".4f") # 소수점 아래 자리 수. 1234567.0000
format(1234567, "x") # 16진수 표기. 12d687
format(1234567, "o") # 8진수 표기. 4553207
format(1234567, "e") # 지수 표기. 1.234567e+06
format(1234567, "0>10") # 총 10칸 왼쪽 0 채우기. 0001234567
# 응용
format(1234567.12, "0>20,.6f") # 00001,234,567.120000
# 시간 자리 2칸 표기
hour = format(9,"0>2")
minute = format(43,"0>2")
second = format(2,"0>2")
print(f'{hour}:{minute}:{second}') # 09:43:02
배열
1. index 요소 제거
del L[i]
2. 배열 정렬 여부 확인
L == L.sorted()
3. 배열 뒤집기
L = L[::-1]
4. 배열 정렬
# sort() : 원본 배열 변경
L = [3, 2, 4, 1]
L.sort()
print(L) # [1, 2, 3, 4]
L = [3, 2, 4, 1]
L.sort(reverse=True)
print(L) # [4, 3, 2, 1]
# sorted() : 원본 배열 변경 X
L = [3, 2, 4, 1]
L = sorted(L)
print(L) # [1, 2, 3, 4]
L = [3, 2, 4, 1]
L = sorted(L, reverse=True)
print(L) # [4, 3, 2, 1]
5. 배열 -> 문자열 변환 : 구분자.join(리스트)
L = [5, 3, 1, 7]
print(" ".join(L)) # '5 3 1 7'
print(",".join(L)) # '5,3,1,7'
6. 배열에서 특정한 원소들만 제거
L = [1, 3, 5, 1, 4, 5, 3, 8, 9, 7]
remove_set = {3, 5}
L = [n for n in L if n not in remove_set]
print(L)
# [1, 1, 4, 8, 9, 7]
7. 배열 원소의 합
- 내가 무슨 짓을 해도 sum()보다 빠르기 쉽지 않다.
L = [1, 2, 3]
print(sum(L)) # 6
8. zip
A = [1, 2, 3, 4]
B = ['a', 'b', 'c', 'd']
print(list(zip(A, B))) # [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
딕셔너리
1. key로 value 조회
D = dict({5: 1, 3: 3, 4: 2})
print(D.get(5)) # 1
print(D.get(999, 0)) # 0 -- 찾으려는 값이 없을 때 2번째 값을 출력!
2. key:value 조회
D = dict({5: 1, 3: 3, 4: 2})
print(D)
# {5: 1, 3: 3, 4: 2} -- 딕셔너리 그대로 조회된다.
print(D.items())
# dict_items([(5, 1), (3, 3), (4, 2)]) -- 튜플로 조회된다.
print(D.keys())
# dict_keys([5, 3, 4]) -- key만 조회된다.
print(D.values())
# dict_values([1, 3, 2]) -- value만 조회된다.
3. 정렬
D = dict({5: 1, 3: 3, 4: 2})
print(sorted(D))
# [3, 4, 5] -- key들이 정렬된 list가 조회된다.
print(sorted(D.items()))
# [(3, 3), (4, 2), (5, 1)] -- (key, value) 튜플이 정렬된 list가 조회된다.
print(sorted(D.items(), key = lambda x: x[1]))
# [(5, 1), (4, 2), (3, 3)] -- value 기준으로 튜플이 정렬된 list가 조회된다.
4. 최소값, 최대값
참고) 정렬도 하고 최소, 최대를 찾아야할 땐 정렬해서 D[0], D[-1] 구하는 게 낫다.
D = dict({5: 1, 3: 3, 4: 2})
print(min(D.keys())) # 3
print(max(D.keys())) # 5
print(min(D.values())) # 1
print(max(D.values())) # 3
# key나 value로 구해서 튜플로 반환 받고 싶을 때는 items()를 넘기고, 비교 key를 지정하자.
print(min(D.items(), key = lambda x: x[1]))
# (5, 1)
5. index로 value 조회
딕셔너리 values()를 list로 캐스팅
D = dict({5: 1, 3: 3, 4: 2})
print(list(D.values())[0]) # 1
Set
1. 집합 연산
A = set([1, 2, 3, 4, 5, 6])
B = set([2, 3, 5, 7, 9])
print(A.intersection(B)) # 교집합. {1, 4, 6}
print(A.difference(B)) # 차집합. {1, 4, 6}
print(A.union(B)) # 합집합. {1, 2, 3, 4, 5, 6, 7, 9}
# 축약어
print(A & B) # 교집합. {1, 4, 6}
print(A - B) # 차집합. {1, 4, 6}
print(A | B) # 합집합. {1, 2, 3, 4, 5, 6, 7, 9}
2. 요소 연산
S = set([])
S.add(1)
print(S) # {1}
S.update([2, 3])
print(S) # {1, 2, 3}
S.update([2, 3])
print(S) # {1, 3}
Queue
- 배열, queue 말고 deque 쓰자.
- queue와 달리, deque는 파이썬의 자료구조의 일종이다.
- 공식 문서에서도 deque는 배열과 비슷하게 동작하지만, 그 연산의 복잡도에 있어 deque가 더 빠르게 동작하도록 설계되어 있다고 한다. (양 방향 입출력 모두 O(1))
Itertools
1. accumulate, 누적합
from itertools import accumulate
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = list(accumulate(a))
print(b) # [1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
b = list(accumulate(a, initial=0))
print(b) # [0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
- 값이 누적되어 반환된다.
- for문 만으로도 값을 누적한 리스트를 뽑을 수 있지만 속도면에서 큰 차이가 난다.
2. Combinations, 조합
- 수학 시간 nCr의 그 조합.
- 순서 상관 없이 n개 중에서 r개를 뽑을 때 경우의 수
- ex)
(1, 2)
와(2, 1)
은 같은 경우from itertools import* A = [1, 2, 3] print(list(combinations(A, 2))) # [(1, 2), (1, 3), (2, 3)] # 3C2 = (3 * 2) / (2 * 1) = 3가지
3. Permutations, 순열
- 수학 시간 nPr의 그 순열.
- 순서 상관 있게 n개 중에서 r개를 뽑을 때 경우의 수
- ex) (1, 2)와 (2, 1)은 다른 경우
from itertools import*
A = [1, 2, 3]
print(list(permutations(A, 2)))
# [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
# 3P2 = 3 * 2 = 6가지
4. Product, 중복 순열
from itertools import*
A = [1, 2, 3]
print(list(product(A, repeat = 2)))
# [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
2진 탐색 (Binary Search)
def binary_search(L, start, end, target):
if start > end:
return -1
mid = (start + end)
if L[mid] == target:
return mid
elif L[mid] < target:
start = mid + 1
else:
end = mid - 1
return binary_search(L, start, end, target)
👏
자, 이렇게 파이썬 코딩테스트할 때 반드시 알아둬야할 것들에 대해서 정리해봤는데요. 그간 제가 알고리즘 풀면서 쌓아온 지식들입니다! 😎
이 치팅 페이퍼가 코딩테스트 준비에 큰 도움이 되길 바랍니다. 화이팅!
더 많은 도움을 얻고 싶으시다면! 아래 단톡방으로 찾아와주세요!
https://open.kakao.com/o/gbuVErVf
'개발자' 카테고리의 다른 글
알고리즘 코딩 테스트 문제 풀이 시 반드시 알아야할 것 (꿀팁, 속도, 성능, 최적화, 개발자, 취업, 신입, 경력, 이직, 코테 준비) (0) | 2024.04.15 |
---|---|
개발자와 가면 증후군 (Developer Imposter Syndrome) (0) | 2024.04.11 |
알고리즘 코딩 테스트 즐기면서 준비하는 방법 (백준, solved.ac) (3) | 2024.03.29 |
AWS 클라우드의 기초! AWS Cloud Practitioner 자격증 시험 후기 (1) | 2023.08.29 |