| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
바킹독의 실전 알고리즘 강좌와 워크북 문제들을 Python으로 풀이한 저장소입니다.
원본 워크북에는 C++ 풀이만 있어서, Python으로 코딩테스트를 준비하시는 분들을 위해 Python 버전을 작성했습니다. 강좌를 따라가면서 참고하시면 좋을 것 같습니다!!
Python에는 나름의 코딩 규칙들이 있습니다. 코딩테스트나 PS에서 코딩할 때 "일단 돌아가면 장땡이지!"라고 생각하고 대충 코딩하기 쉬운데, 저는 이런 규칙들을 지키면서 짜는 편입니다.
실제 개발도 아닌데 조금 과하다고 느낄 수 있습니다. 하지만 코딩테스트에서도 시간이 촉박하다고 대충 짜면 오히려 디버깅에서 시간을 더 잡아먹습니다. 몇 분 전에 짠 코드도 돌아서면 까먹거든요. "이 변수가 뭐였지?", "이 함수 반환값이 뭐였더라?" 하면서 코드를 다시 읽는 시간이 쌓입니다.
타입 힌트 하나, 함수 분리 하나가 이런 실수를 줄여줍니다. 처음엔 조금 느린 것 같아도, 결국 제대로 돌아가는 코드를 짜는 게 가장 빠른 길입니다.
실무에서도 보면 코딩 잘하는 신입들도 이런 규칙 없이 본인 스타일대로 짜는 경우가 많습니다. 그러면 나중에 "이 함수 뭘 받는 거지?" 하고 코드를 뒤져보고 분석해야 합니다. 이러한 경험이 있는 면접관이 코드를 본다면, 깔끔하게 정리된 코드가 좋은 인상을 줄 수 있지 않을까요?
물론 알고리즘 효율이 우선인 경우엔 Pythonic하지 않은 방식이 나을 때도 있고, 상황에 따라 애매한 지점이 있습니다. 저도 완벽하지 않아서 일관성이 부족한 부분이 있을 수 있으니 참고용으로 봐주세요!!
PEP8은 Python 공식 스타일 가이드입니다. 들여쓰기는 스페이스 4칸, 한 줄은 79자 이내, 함수명은 snake_case 등 이런 규칙들을 정해둔 문서입니다.
이게 왜 필요하냐면, 모두가 비슷한 스타일로 코드를 작성하면 다른 사람 코드를 읽기가 훨씬 편해지기 때문입니다. 협업할 때 특히 중요합니다.
물론 처음부터 이 모든 규칙을 외울 수는 없습니다. 그래서 VSCode 같은 IDE를 쓸 때 Pylint 같은 linter의 도움을 받으면 좋습니다. 코드를 짜면서 실시간으로 "여기 스타일이 잘못됐어요"라고 알려주거든요.
함수의 인자와 반환값에 타입을 명시하는 것입니다.
# Type Annotation X
def add(a, b):
return a + b
# Type Annotation O
def add(a: int, b: int) -> int:
return a + bPython은 타입을 안 써도 돌아가지만, 써두면 "이 함수는 정수 두 개를 받아서 정수를 반환한다"는 의도가 명확해집니다. IDE 자동완성도 잘 되고, 실수도 미리 잡아줍니다.
Python에는 "The Zen of Python"이라는 철학이 있습니다. 터미널에서 import this를 입력하면 볼 수 있습니다. 핵심은 가독성, 간결함, 명료함입니다.
Pythonic한 코드란 Python의 특성을 잘 활용해서 간결하고 읽기 쉽게 작성한 코드를 말합니다. 몇 가지 예시를 보면:
# 1. 반복문 - range(len()) 대신 enumerate 사용
# Bad
for i in range(len(numbers)):
print(numbers[i])
# Good
for i, num in enumerate(numbers):
print(i, num)
# 2. 리스트 생성 - for loop 대신 list comprehension
# Bad
squares = []
for i in range(10):
squares.append(i * i)
# Good
squares = [i * i for i in range(10)]
# 3. 변수 교환 - temp 변수 대신 튜플 언패킹
# Bad
temp = a
a = b
b = temp
# Good
a, b = b, a처음엔 어색할 수 있지만, 익숙해지면 코드가 훨씬 깔끔해집니다.
모든 풀이는 이런 구조를 따릅니다:
""" solve.py for {문제번호}. {문제명} """
import sys
def sys_input() -> str:
return sys.stdin.readline().rstrip()
def solve(...) -> ...:
# 핵심 알고리즘 로직
pass
def main() -> None:
# 입력 처리
# solve 호출
# 출력 처리
answer = solve(...)
print(answer)
if __name__ == "__main__":
main()| 요소 | 역할 |
|---|---|
| sys_input() | sys.stdin.readline().rstrip() 래핑. 백준에서 input() 대신 쓰면 입력이 빨라집니다 |
| solve() | 순수한 알고리즘 로직만 담당. 입출력과 분리해서 테스트하기 좋습니다 |
| main() | 입력 파싱 → solve() 호출 → 결과 출력. 프로그램의 진입점입니다 |
| Type Annotation | 모든 함수에 타입 힌트를 답니다. 의도가 명확해지고 실수를 줄여줍니다 |
. ├── 0x02. basic coding tips/ ├── 0x03. array/ ├── 0x04. linked list/ ├── 0x05. stack/ ├── 0x06. queue/ ├── 0x07. deque/ ├── 0x08. stack (bracket matching)/ ├── 0x09. bfs/ ├── 0x0b. recursion/ ├── 0x0c. backtracking/ ├── 0x0d. simulation/ ├── 0x0e. sorting I/ ├── 0x0f. sorting II/ ├── 0x10. dynamic programming/ ├── 0x11. greedy/ └── README.md
각 폴더 안에는 {문제번호}번. {문제명}/solve.py 형태로 풀이가 들어있습니다.
현재 0x11강 (그리디) 까지 풀이가 완료되어 있습니다. 이후 강의 풀이는 차차 추가할 예정입니다.
바킹독님이 오리엔테이션에서 언급하셨듯이, 삼성 A형을 포함한 많은 기업 코딩테스트가 BFS/DFS/백트래킹/시뮬레이션 위주로 출제되기 때문에 시간이 없으신 분들은 0x11강까지 보시는 것을 추천드립니다.
Pylance는 VSCode Python extension에 포함되어 있으며, Pylint는 VSCode Extensions에서 검색해서 설치하면 됩니다. 코드 짜면서 실시간으로 피드백을 받을 수 있어서 정말 좋습니다.
오류 수정이나 더 나은 풀이 제안은 언제든 환영합니다!! 🙌
원본 강좌: 바킹독의 실전 알고리즘
원본 워크북: basic-algo-lecture
| Back | FazBrowse Home | New Git URL |