코테 언어로 파이썬이 간편하다고 생각해서 사용을 많이 하는데
사소한 실수 때문에 의외로 시간을 까먹는 경우가 많습니다.
코딩 문제를 통과하려면 알아둬야 할 몇가지가 있는데 대표적인 것을 정리해보려 합니다.
시간초과
input 이 스레드세이프 해서 그런지 엄청 느리다고 합니다. 시간초과 주범이므로 아래와 같이 치환 가능합니다.
import sys
input = sys.stdin.readline
# 아래에서 이전처럼 input 사용 가능
최대 재귀 초과
maximum 을 늘려주는 수 밖에 없음
import sys
sys.setrecursionlimit(10**6)
백준 온라인 저지 외에는 사용할 일이 아직 많지는 않았지만 알아둬야 할 것 같아서 언급하였습니다.
기본들
그 외 파이썬 문법 자체에 익숙치 않아서 실수하거나 코테에서 많이 쓰이는 부분은 여전히 연습이 필요하겠습니다.
join 처리를 좀 더 간단히 하여 print 하는 법
arr 값 [1, 2, 3, 4, 5] 를 "1 2 3 4 5" 로 어떻게 print 할 것 인가?
print(' '.join(map(str, arr))) 대신
print(*arr)
를 쓰면 간단하다.
어떻게 동작하는 걸까?
여기서의 *(asterisk) 는 unpacking 의 용도이다 (* 는 그외에 일반적인 곱셈, 거듭제곱, 리스트형 인자 확장, 가변인자 용도로 쓰인다)
리스트가 unpacking 되었으므로 마치 print(1,2,3,4,5) 처럼 동작한다.
ZIP
unpacking 을 배웠으므로 반대 기능을 하는 zip도 알아두면 좋습니다.
zip 을 쓰면 두 리스트를 마치 join 하는것처럼 병합해줍니다.
# 두 리스트를 하나로 병합
first_name = ['Joe', 'Earnst', 'Thomas', 'Martin', 'Charles']
last_name = ['Schmoe', 'Ehlmann', 'Fischer', 'Walter', 'Rogan']
result = list(zip(first_name, last_name))
# = [('Joe', 'Schmoe'), ('Earnst', 'Ehlmann'), ('Thomas', 'Fischer'), ('Martin', 'Walter'), ('Charles', 'Rogan')]
# *를 써서 다시 두 리스트로 분리
first_name, last_name = zip(*result)
스플릿
문자열.split(sep, maxsplit)
구분자와 max구분은 생략가능
정렬
my_list.sort(reverse=False) 와
sorted(my_list, key=None, reverse=False) 를 구분하여 쓸 줄 알면 됩니다.
sort 는 list 내 in place 방식으로 사용 및 구현된 방식이라 그 리스트 자체가 변경되며 리턴도 없음
sorted 는 리스트 뿐만아니라 어떤 iterable 도 가능하며 기존 리스트를 변경하지 않고 별도의 리스트를 반환
아래는 sorted 를 이용하여 멀티 정렬하는 예제
# Sort the list by second column (index 2) in descending order,
# then by first column (index 0) in ascending order
a = [[2, 5, 3], [1, 5, 3], [5, 5, 1], [4, 5, 1]]
sorted_a = sorted(a, key=lambda x: (-x[2], x[0]))
print(sorted_a)
# [[1, 5, 3], [2, 5, 3], [4, 5, 1], [5, 5, 1]]
enumerate
파이썬에서 맘에 드는 녀석,
enumerate는 Python에서 반복 가능한(iterable) 객체(예: 리스트, 튜플, 문자열)를 순회하면서 각 요소의 인덱스와 값을 함께 얻기 위한 내장 함수입니다.
이 함수는 반복(iteration)을 좀 더 편리하게 만들어줍니다.
my_list = ['apple', 'banana', 'cherry']
for index, value in enumerate(my_list):
print(f'Index {index}: {value}')
#Index 0: apple
#Index 1: banana
#Index 2: cherry
거꾸로 돌아가서,
일단 변수나 함수 같은 대표적인 언어 사용에 대해서 주의해야 할 부분들이 제법 있습니다.
변수 scope 및 대표적으로 많이쓰는 list 사용시 주의 점에 대해 블로그글로 남겼으니 꼭 보셔야 합니다.
https://ohollama.tistory.com/58
Python 변수의 Scope와 Mutable vs. Immutable 데이터 타입
Python은 다양한 데이터 타입과 변수의 스코프(scope)를 지원하여 개발자에게 유연성을 제공합니다. 그러나 이러한 유연성은 종종 변수의 범위(scope)와 데이터 타입의 가변성(mutable) 여부에 따라 동
ohollama.tistory.com
오류 메시지에 대한 대처
이건 순전히 경험부족 때문이라고 생각됩니다.
파이썬으로 코딩문제를 풀때 나오는 에러 메시지에 대해서 익숙치 않으면 단순한 오타를 발견하는데에 시간을 빼앗기게 됩니다.

예:
TypeError: builtin_function_or_method object is not subscriptable
주로 function() 처럼 괄호를 써야 할 것을 어떤 이유에선지 실수로 '[]' 를 사용하여 function[] 처럼 쓰는 경우에 발생합니다.
검색해보니 이미 많은 이들이 경험하고 있는 실수인 것 같은데, 의외로 발견하는데 시간이 걸릴 수 있으므로, 힌트 제공이라던지, 에러메시지가 개선되면 좋을 것 같습니다.
TypeError: 'Counter' object is not callable
위와는 반대로 '[ ]' 로 써야 할 것을 실수로 '()' 를 사용하여 call 하려 하는 경우에 발생합니다.
TypeError: 'tuple' object does not support item assignment
튜플과 리스트의 차이점을 망각하고, 튜플을 변경하려고 하면 볼 수 있는 에러이다.
튜플은 immutable 이므로 리스트형으로 바꾸던지 해야한다.
eg) my_list = list(my_tuple)
ValueError: invalid literal for int() with base 10: '1.2'
String 을 integer 로 바꾸거나 할 때 위와 같은 에러가 발생하는 경우가 있다.
문자열이 비어있거나 위 처럼 실수형 문자열로 들어왔거나 할 때인데,
의외로 귀찮지만? 실수형의 경우는 아래 처럼 실수로 바꾸었다가 정수형으로 변환해줘야 한다.
my_value = 1.2
print(int(float(my_value)))
# 1 출력 됨
UnboundLocalError: local variable 'cnt' referenced before assignment
함수 내에서 함수 밖에 정의한 변수를 쓰려고 하면 발생한다.
'global 변수명' 이라는 한 줄을 추가로 넣어주면 된다.
cnt = 0
def func():
global cnt
cnt += 1
...
'IT > 알고리즘 코딩' 카테고리의 다른 글
Python 변수의 Scope와 Mutable vs. Immutable 데이터 타입 (0) | 2023.10.14 |
---|---|
[코테] 알고리즘 공부 Cheat sheet - 0 (자료구조) (0) | 2023.04.20 |
[코테] 알고리즘 공부 Cheat sheet - III (DP) (0) | 2023.04.17 |
[코테] 알고리즘 공부 Cheat sheet - II (search) (0) | 2023.04.16 |
[코테] 알고리즘 공부 Cheat sheet - I (0) | 2023.04.09 |