더 많은 도움을 드리기 위해

열심히 포스팅 중입니다!


지나가다 📢 광고 한 번 눌러주시면

더 좋은 글로 보답하겠습니다. 🥰

개발자

코딩테스트 직전 벼락치기를 위한 파이썬 치팅 페이퍼 (알고리즘, 암기 노트, 벼락치기, 단기 준비)

평비(개취비) 2024. 7. 20. 13:21

 

👋

안녕하세요~ 위대한 개취비입니다!

 

코딩테스트를 앞두고 준비에 박차를 가하고 계신가요? 🤗

이번 글에서는 코딩테스트 직전에 오신 여러분들을 위해 꼭 알아야 할 핵심 포인트들을 모아 치팅 페이퍼 형식으로 정리해 보았습니다. 이 치팅 페이퍼는 마지막 순간까지도 도움을 줄 수 있는 중요한 개념과 팁을 포함하고 있습니다. 잘 활용하셔서 좋은 결과 얻으시길 바랍니다!

 

코딩 테스트는 꾸준한 연습과 체계적인 준비가 필요하지만, 시간이 얼마 남지 않은 분들이 있을 수 있기 때문에... 혹은 경력 지원인데 갑작스럽게 코딩테스트를 보셔야 하는 분들을 위해 작성했습니다! 🚀

 

기본

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

 

LG CNS 현직자 Q&A 2024

#LG #LGCNS #개발 #개발자 #현직자 #SI회사 #취업

open.kakao.com