Python 주니어 코딩 기술면접

Python 주니어 (1~3년) 코딩 · 알고리즘 5문항 조회수 68 · 2026-06-06 (토) 19:10:44
1 문자열 처리
Easy

Q. Python에서 문자열의 일부를 추출하는 슬라이싱(Slicing) 문법을 설명하고, 음수 인덱스를 사용했을 때 어떻게 동작하는지 예시와 함께 설명해주세요.

A. 모범답안

슬라이싱은 string[start:end:step] 형식으로 문자열의 일부를 추출하는 방법입니다. start는 시작 인덱스(포함), end는 종료 인덱스(미포함), step은 간격을 의미합니다. 음수 인덱스는 문자열의 끝에서부터 역순으로 카운트하며, -1은 마지막 문자를 의미합니다. 예를 들어 'hello'[-3:]는 'llo'를 반환하고, 'hello'[::-1]은 문자열을 역순으로 뒤집어 'olleh'를 반환합니다. 슬라이싱은 원본 문자열을 변경하지 않고 새로운 문자열 객체를 생성합니다.

핵심 포인트
  • • start:end:step 형식으로 구간 추출
  • • 음수 인덱스는 뒤에서부터 카운트(-1이 마지막)
  • • 원본을 변경하지 않고 새 객체 생성
  • • step을 음수로 하면 역순 추출 가능
Follow-up 질문

슬라이싱을 사용할 때 인덱스 범위를 벗어나면 어떻게 되나요? 일반 인덱싱과 어떤 차이가 있나요?

2 재귀 알고리즘
Medium

Q. 재귀 함수(Recursive Function)를 사용해서 팩토리얼을 계산하는 방법을 설명하고, 재귀 함수를 작성할 때 반드시 필요한 요소들은 무엇인지 설명해주세요.

A. 모범답안

재귀 함수는 자기 자신을 호출하는 함수로, 팩토리얼의 경우 n! = n * (n-1)!의 성질을 이용합니다. 재귀 함수 작성 시 반드시 필요한 요소는 첫째, 기저 조건(Base Case)으로 재귀를 종료하는 조건이 필요하고, 둘째, 재귀 호출(Recursive Call)로 문제를 더 작은 하위 문제로 분할해야 합니다. 팩토리얼의 경우 n이 0이나 1일 때 1을 반환하는 것이 기저 조건이고, n * factorial(n-1)이 재귀 호출입니다. 기저 조건이 없으면 무한 재귀로 인해 스택 오버플로우가 발생합니다.

핵심 포인트
  • • 자기 자신을 호출하는 함수
  • • 기저 조건(Base Case)으로 재귀 종료
  • • 재귀 호출로 문제를 작은 하위 문제로 분할
  • • 기저 조건 없으면 무한 재귀 발생
Follow-up 질문

재귀 함수와 반복문(for/while)으로 구현하는 것의 성능 차이는 무엇이며, 각각 어떤 상황에서 사용하는 것이 좋을까요?

3 자료구조
Medium

Q. Python의 collections 모듈에 있는 defaultdict와 일반 dict의 차이점은 무엇이며, defaultdict를 사용하면 좋은 실무 사례를 설명해주세요.

A. 모범답안

defaultdict는 존재하지 않는 키에 접근할 때 KeyError를 발생시키지 않고 기본값을 자동으로 생성하는 딕셔너리입니다. 일반 dict는 없는 키에 접근하면 KeyError가 발생하지만, defaultdict는 생성 시 지정한 factory 함수를 호출해 기본값을 생성합니다. 예를 들어 defaultdict(list)로 생성하면 없는 키에 접근할 때 빈 리스트가 자동 생성됩니다. 실무에서는 그룹화 작업(단어별 문장 리스트 모으기), 카운팅(defaultdict(int)), 그래프의 인접 리스트 구현 등에 유용하며, 코드에서 키 존재 여부를 매번 확인하는 조건문을 줄일 수 있습니다.

핵심 포인트
  • • 존재하지 않는 키 접근 시 기본값 자동 생성
  • • factory 함수로 기본값 타입 지정
  • • KeyError 방지 및 코드 간소화
  • • 그룹화, 카운팅, 그래프 구현 등에 유용
Follow-up 질문

Counter 클래스는 어떤 경우에 사용하며, defaultdict(int)와 어떤 차이가 있나요?

4 리스트 알고리즘
Easy

Q. 두 개의 정렬된 리스트를 하나의 정렬된 리스트로 병합하는 알고리즘을 설명하고, 시간 복잡도는 어떻게 되는지 설명해주세요.

A. 모범답안

두 정렬된 리스트를 병합하려면 두 포인터 기법을 사용합니다. 각 리스트의 시작점에 포인터를 두고, 두 포인터가 가리키는 값을 비교하여 작은 값을 결과 리스트에 추가하고 해당 포인터를 한 칸 이동시킵니다. 한쪽 리스트가 끝나면 나머지 리스트의 남은 요소들을 결과에 모두 추가합니다. 시간 복잡도는 O(n+m)으로, n과 m은 각 리스트의 길이이며, 각 요소를 한 번씩만 확인하므로 선형 시간에 병합이 가능합니다. 이 알고리즘은 병합 정렬(Merge Sort)의 핵심 부분입니다.

핵심 포인트
  • • 두 포인터 기법으로 각 리스트 순회
  • • 작은 값을 선택하여 결과에 추가
  • • 시간 복잡도 O(n+m)으로 선형 시간
  • • 병합 정렬의 핵심 알고리즘
Follow-up 질문

정렬되지 않은 두 리스트를 병합하여 정렬하려면 어떤 방법이 있으며, 각 방법의 시간 복잡도는 어떻게 되나요?

5 함수형 프로그래밍
Medium

Q. Python의 map, filter, reduce 함수의 역할과 차이점을 설명하고, 리스트 컴프리헨션과 비교했을 때 어떤 상황에서 각각을 사용하는 것이 좋은지 설명해주세요.

A. 모범답안

map은 iterable의 모든 요소에 함수를 적용하여 변환하고, filter는 조건을 만족하는 요소만 선택하며, reduce는 요소들을 누적하여 하나의 값으로 축약합니다. map과 filter는 지연 평가되는 iterator를 반환하고, reduce는 functools 모듈에서 import해야 합니다. 리스트 컴프리헨션은 가독성이 좋고 pythonic하여 간단한 변환과 필터링에 선호되며, map/filter는 이미 정의된 함수를 재사용할 때 유용합니다. reduce는 복잡한 누적 연산에 사용되지만, 가독성을 위해 명시적인 for 루프나 sum 같은 내장 함수로 대체하는 것이 권장됩니다.

핵심 포인트
  • • map은 변환, filter는 선택, reduce는 누적
  • • map/filter는 지연 평가 iterator 반환
  • • 리스트 컴프리헨션이 더 pythonic하고 가독성 좋음
  • • 기존 함수 재사용 시 map/filter 유용
Follow-up 질문

람다 함수(lambda)는 언제 사용하는 것이 적절하며, 일반 함수 정의와 비교했을 때 제약사항은 무엇인가요?

댓글 0

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

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