Python 미드레벨 CS 기초 기술면접

Python 미드레벨 (3~7년) CS 기초 5문항 조회수 112 · 2026-05-22 (금) 19:10:59
1 자료구조
Medium

Q. Python의 list와 collections.deque의 내부 구조 차이를 설명하고, 각각의 append(), pop(), insert(0, x) 연산의 시간복잡도를 비교해주세요. 실무에서 큐(Queue) 자료구조가 필요할 때 어떤 것을 선택해야 하는지 설명해주세요.

A. 모범답안

list는 동적 배열로 구현되어 있어 연속된 메모리 공간에 데이터를 저장하고, deque는 이중 연결 리스트 기반의 블록 구조로 구현되어 있습니다. list의 append()와 pop()은 O(1)이지만 insert(0, x)는 모든 요소를 이동시켜야 하므로 O(n)입니다. 반면 deque는 양쪽 끝에서의 삽입/삭제가 모두 O(1)로 최적화되어 있습니다. 따라서 FIFO 큐나 양방향 큐가 필요한 실무 상황에서는 deque를 사용하는 것이 성능상 유리하며, 인덱스 기반 랜덤 액세스가 빈번하다면 list가 더 적합합니다.

핵심 포인트
  • • list는 동적 배열, deque는 이중 연결 리스트 기반 블록 구조
  • • list의 insert(0, x)는 O(n), deque의 appendleft()는 O(1)
  • • 큐 구현 시 deque 사용이 성능상 유리
  • • 인덱스 접근이 많으면 list, 양끝 삽입/삭제가 많으면 deque
Follow-up 질문

대용량 로그 데이터를 처리할 때 최근 N개의 항목만 메모리에 유지해야 한다면 어떤 자료구조와 전략을 사용하시겠습니까?

2 알고리즘
Medium

Q. 정렬 알고리즘 중 Quick Sort와 Merge Sort의 시간복잡도와 공간복잡도를 비교하고, Stable Sort의 개념을 설명해주세요. Python의 내장 sort()가 Timsort를 사용하는 이유와 실무적 이점을 설명해주세요.

A. 모범답안

Quick Sort는 평균 O(n log n), 최악 O(n²)의 시간복잡도를 가지며 in-place 정렬로 O(log n)의 공간복잡도를 가지지만 불안정 정렬입니다. Merge Sort는 항상 O(n log n)이지만 O(n)의 추가 메모리가 필요하고 안정 정렬입니다. Stable Sort는 동일한 값을 가진 요소들의 상대적 순서가 유지되는 정렬입니다. Python의 Timsort는 Merge Sort와 Insertion Sort를 결합한 하이브리드 알고리즘으로, 실제 데이터에서 자주 나타나는 부분 정렬된 패턴을 활용하여 최선의 경우 O(n)까지 성능을 낼 수 있으며, 안정 정렬이라는 점에서 실무에서 예측 가능한 동작을 보장합니다.

핵심 포인트
  • • Quick Sort: 평균 O(n log n), 최악 O(n²), 불안정 정렬, O(log n) 공간
  • • Merge Sort: 항상 O(n log n), 안정 정렬, O(n) 공간
  • • Stable Sort는 동일 값의 상대적 순서 유지
  • • Timsort는 실제 데이터의 패턴을 활용한 하이브리드 알고리즘
Follow-up 질문

실무에서 수백만 개의 사용자 데이터를 여러 필드(나이, 가입일, 이름)로 다중 정렬해야 할 때, 정렬 알고리즘의 안정성이 왜 중요한지 구체적인 예시를 들어 설명해주세요.

3 네트워크
Medium

Q. TCP의 3-way handshake와 4-way handshake 과정을 설명하고, TIME_WAIT 상태가 존재하는 이유를 설명해주세요. 실무에서 서버의 TIME_WAIT 소켓이 과도하게 많아졌을 때 발생할 수 있는 문제와 해결 방법을 제시해주세요.

A. 모범답안

3-way handshake는 연결 수립 시 SYN → SYN-ACK → ACK 순서로 진행되며, 4-way handshake는 연결 종료 시 FIN → ACK → FIN → ACK 순서로 진행됩니다. TIME_WAIT 상태는 연결을 먼저 종료한 쪽이 2MSL(Maximum Segment Lifetime) 동안 유지하는데, 지연된 패킷이 새로운 연결에 영향을 주는 것을 방지하고 상대방의 마지막 ACK 손실 시 재전송을 처리하기 위함입니다. 실무에서 TIME_WAIT 소켓이 많으면 포트 고갈 문제가 발생할 수 있으며, SO_REUSEADDR 옵션 사용, 커넥션 풀링, Keep-Alive 활용, 또는 클라이언트가 먼저 연결을 종료하도록 설계하는 방법으로 해결할 수 있습니다.

핵심 포인트
  • • 3-way handshake: SYN → SYN-ACK → ACK (연결 수립)
  • • 4-way handshake: FIN → ACK → FIN → ACK (연결 종료)
  • • TIME_WAIT은 지연 패킷 문제와 마지막 ACK 손실 처리를 위해 존재
  • • 과도한 TIME_WAIT은 포트 고갈 유발, 커넥션 풀링과 Keep-Alive로 완화
Follow-up 질문

HTTP/1.1의 Keep-Alive와 HTTP/2의 멀티플렉싱이 TIME_WAIT 문제를 어떻게 완화하는지 설명하고, 각각의 장단점을 비교해주세요.

4 데이터베이스
Hard

Q. 데이터베이스 트랜잭션의 격리 수준(Isolation Level) 4가지를 설명하고, 각 수준에서 발생할 수 있는 문제(Dirty Read, Non-Repeatable Read, Phantom Read)를 설명해주세요. 실무에서 전자상거래 주문 시스템을 구현할 때 어떤 격리 수준을 선택해야 하는지 그 이유와 함께 설명해주세요.

A. 모범답안

READ UNCOMMITTED는 커밋되지 않은 데이터를 읽을 수 있어 Dirty Read가 발생하고, READ COMMITTED는 커밋된 데이터만 읽지만 같은 쿼리를 반복하면 다른 결과가 나올 수 있는 Non-Repeatable Read가 발생합니다. REPEATABLE READ는 트랜잭션 내에서 같은 행은 동일한 값을 보장하지만 새로운 행이 추가되는 Phantom Read가 발생할 수 있으며, SERIALIZABLE은 모든 문제를 방지하지만 성능이 가장 낮습니다. 전자상거래 주문 시스템에서는 재고 차감과 주문 생성이 원자적으로 처리되어야 하고, 동시성 제어가 중요하므로 REPEATABLE READ 이상을 사용해야 하며, MySQL InnoDB의 경우 REPEATABLE READ에서 Next-Key Lock으로 Phantom Read도 방지하므로 이를 기본으로 사용하되, 결제 같은 핵심 트랜잭션에는 비관적 락(SELECT FOR UPDATE)을 함께 사용하는 것이 안전합니다.

핵심 포인트
  • • READ UNCOMMITTED: Dirty Read 발생
  • • READ COMMITTED: Non-Repeatable Read 발생
  • • REPEATABLE READ: Phantom Read 발생 가능 (DB 엔진에 따라 다름)
  • • SERIALIZABLE: 모든 문제 방지, 성능 저하
  • • 주문 시스템은 REPEATABLE READ + 비관적 락 조합 권장
Follow-up 질문

재고 관리 시스템에서 낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock) 중 어떤 것을 선택해야 하는지, 동시 접속자 수와 재고 수량에 따라 어떻게 달라지는지 설명해주세요.

5 운영체제
Medium

Q. 프로세스와 스레드의 차이를 메모리 구조 관점에서 설명하고, 컨텍스트 스위칭(Context Switching) 비용이 프로세스와 스레드 간에 어떻게 다른지 설명해주세요. Python에서 multiprocessing과 threading 모듈을 선택할 때 고려해야 할 사항을 실무 예시와 함께 설명해주세요.

A. 모범답안

프로세스는 독립적인 메모리 공간(코드, 데이터, 힙, 스택)을 가지며 각각 별도의 주소 공간에서 실행되지만, 스레드는 같은 프로세스 내에서 코드, 데이터, 힙을 공유하고 스택만 독립적으로 가집니다. 컨텍스트 스위칭 시 프로세스는 메모리 맵, 캐시, TLB 등을 모두 교체해야 하지만 스레드는 레지스터와 스택만 교체하면 되어 비용이 훨씬 적습니다. Python에서는 GIL로 인해 CPU-bound 작업은 multiprocessing으로 병렬 처리하고, I/O-bound 작업은 threading이나 asyncio로 동시성을 확보하는 것이 효율적입니다. 예를 들어 이미지 처리나 데이터 분석은 multiprocessing, 웹 크롤링이나 API 호출은 threading/asyncio가 적합합니다.

핵심 포인트
  • • 프로세스는 독립 메모리 공간, 스레드는 메모리 공유
  • • 프로세스 컨텍스트 스위칭이 스레드보다 비용이 큼
  • • Python은 GIL로 인해 CPU-bound는 multiprocessing 필요
  • • I/O-bound 작업은 threading 또는 asyncio가 효율적
Follow-up 질문

대용량 CSV 파일을 읽어서 복잡한 데이터 변환 후 데이터베이스에 저장하는 배치 작업을 설계한다면, multiprocessing과 threading을 어떻게 조합하여 사용하시겠습니까?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!