# 내가 좋아하는 소프트웨어 엔지니어링 인터뷰 질문: 중앙값 계산

> Clean Markdown view of GeekNews topic #31248. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=31248](https://news.hada.io/topic?id=31248)
- GeekNews Markdown: [https://news.hada.io/topic/31248.md](https://news.hada.io/topic/31248.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2026-07-09T09:10:05+09:00
- Updated: 2026-07-09T09:10:05+09:00
- Original source: [krisshamloo.com](https://krisshamloo.com/blog/007)
- Points: 1
- Comments: 1

## Topic Body

- 기술 인터뷰의 작은 구현 문제는 퍼즐보다 효과적일 수 있으며, **중앙값 계산**은 기본 코딩 능력과 설계 감각을 함께 드러냄
- 정렬이 필요한 문제라서 함수가 직접 정렬할지, 호출자가 정렬할지, 원본 배열을 **변경해도 되는지** 같은 API 논의로 자연스럽게 이어짐
- 홀수와 짝수 길이를 나누는 분기, 인덱스 계산, **off-by-one** 실수는 후보자의 디버깅 과정을 관찰하기 좋음
- 중앙값과 평균의 차이, 테스트 작성 용이성, Python의 **statistics** 표준 라이브러리 지식까지 짧은 문제 안에서 확인할 수 있음
- 예시 구현은 빈 리스트에서 `ValueError`를 던지고, `sorted()`로 복사 정렬한 뒤 짝수 길이는 가운데 두 값의 평균, 홀수 길이는 가운데 값을 반환함

---

### 중앙값 문제가 인터뷰에 적합한 이유
- 좋은 기술 인터뷰 질문은 퍼즐처럼 꼬아낸 문제가 아니라, **직관적인 구현** 안에서 더 깊은 주제를 꺼낼 수 있어야 함
- “숫자 배열을 받아 중앙값을 반환하는 함수를 작성하라”는 질문은 후보자가 실제로 프로그래밍할 수 있는지 확인하는 **Fizz Buzz**류 신호로 쓰기 좋음
- 배열 값을 하나의 결과로 줄이는 작업은 기본 역량에 해당하며, 문제 자체도 충분히 작아 대화와 디버깅을 함께 보기 쉬움

### 구현 과정에서 드러나는 판단 지점
- 중앙값 계산에는 먼저 **정렬**이 필요함
  - 함수가 직접 정렬할지, 호출자가 정렬된 배열을 넘겨야 할지 정해야 함
  - 배열이 참조로 전달될 때 원본을 바꿔도 되는지도 API 계약에 포함됨
  - 이런 선택은 성능 논의와도 연결됨
- 인덱스 계산에는 **off-by-one** 함정이 있음
  - 실수 여부보다 작은 문제를 어떻게 디버깅하는지 관찰할 수 있음
- 배열 길이에 따라 반환 방식이 달라짐
  - 짝수 길이는 가운데 두 값의 평균을 반환함
  - 홀수 길이는 가운데 값을 반환함

### 짧은 문제로 확장되는 대화
- 중앙값은 평균과 비교해 대부분의 경우 왜 더 나은 선택일 수 있는지 같은 **통계 논의**로 이어질 수 있음
- 입력과 기대값이 단순해 테스트하기 쉬우며, 후보자가 테스트 감각을 보여주기 좋음
- Python에서는 [`statistics`](https://docs.python.org/3/library/statistics.html#module-statistics) 표준 라이브러리 지식을 드러낼 기회도 있음

### 예시 Python 구현의 선택
- 빈 리스트는 `ValueError("median called with empty list")`를 발생시킴
- `sorted(numbers)`를 사용해 `numbers.sort()`와 달리 입력 리스트를 직접 정렬하지 않음
- 길이는 `len(numbers)`로 구하고, 가운데 인덱스는 `mid = length // 2`로 계산함
- 짝수 길이는 `(numbers[mid - 1] + numbers[mid]) / 2.0`을 반환하고, 홀수 길이는 `numbers[mid]`를 반환함

## Comments



### Comment 61457

- Author: neo
- Created: 2026-07-09T09:10:06+09:00
- Points: 1

###### [Lobste.rs 의견들](https://lobste.rs/s/8kxouk/software_engineering_interview) 
- 이 글은 잘 이해가 안 됨. 작성자가 **중앙값은 O(n)에 계산 가능**하다는 걸 모르는 듯함. 참고: https://rcoh.me/posts/linear-time-median-finding/  
  그래서 “처음부터 숫자는 정렬되어 있어야 한다”는 말은 틀렸음. 이런 이유로 좋은 면접 문제도 아니라고 봄. 최적해는 복잡한 알고리즘이라, 외워서 아는 경우가 아니라면 즉석에서 기대하기 어렵고, 외워서 아는지도 후보자 평가에 별 도움이 안 됨.  
  차라리 후보자에게 배열을 라이브러리 함수로 정렬한 뒤 가운데 값을 반환하는 **순진한 풀이**를 내보라고 할 수는 있음
  - 이 문제에 `n*log(n)` 풀이를 냈다가 전화 면접에서 걸러진 기억이 있어서 화가 날 뻔했음  
    나중에 알고리즘 수업에서 **quickselect**를 배웠고, “설마 즉석에서 이걸 떠올리길 기대한 건 아니겠지”라고 생각했음. 뭐, 그 직무에 맞지 않았던 걸지도 모르겠음
  - 글쓴이임. 후보자가 **quickselect**를 언급하면 꽤 인상적일 것 같음. 그래도 이게 나쁜 질문이라고는 생각하지 않음. 직관적인 알고리즘만으로도 이야기할 거리가 많음  
    “배열을 라이브러리 함수로 정렬한 뒤 가운데 값을 반환하는 순진한 풀이”를 기대할 수 있다는 말에 대해서는, 후보자에게 [python standard library](https://github.com/python/cpython/blob/main/Lib/statistics.py#L328)보다 나은 코드를 기대하지는 않음

- 보너스로, 누군가 알고리즘을 공부했는지, 적어도 면접 준비를 했는지 바로 알 수 있음. **quickselect**를 쓰자고 제안할 테니까: https://en.wikipedia.org/wiki/Quickselect
  - 그게 언급되지 않아서 놀랐음. 이 질문을 받고 C++을 쓴다면 [nth_element](https://en.cppreference.com/cpp/algorithm/nth_element)를 쓸 것 같음  
    그리고 quickselect를 처음부터 직접 써야 한다면 그것도 가능함. 기본적으로 **분할 + 이분 탐색**에 가까움
  - 실제로는 그렇지 않다고 봄. 이 질문은 기본적인 “진짜 프로그래밍을 할 수 있나?”, 즉 “스크리너가 자기 일을 제대로 했나?”를 보는 문제처럼 보임. quickselect를 머릿속에서 줄줄 말할 수 있더라도, 완벽히 하지는 못할 것 같고 면접관 시간을 낭비하지 않으려고 **순진한 풀이**를 고를 것임
  - 배열 길이가 짝수인 경우가 흥미로움. 가운데 두 인덱스에 대해 일반적인 quickselect를 두 번 돌리거나, 작업에 맞게 quickselect를 조정하는 식으로 갈 수 있음. 둘이 사실상 같은 일이 될 수도 있음
  - 리스트가 반드시 정렬되어 있어야 한다는 요구가 있어서 헷갈렸음. 직관적으로도 꼭 그래야 하는 건 아님
  - LLM에게서 받은 답이 이거였고, 필요하면 고를 수 있는 **불변 변형**까지 덤으로 있었음

- Python의 `int` 타입은 오버플로가 없지만, C나 C++나 Go를 쓴다면 짝수 길이 배열 분기에서 **덧셈 오버플로**도 걱정해야 하지 않나?
  - 그 덧셈은 `int`가 아니라 `float`에서 일어남. 그래도 오버플로로 `inf`가 될 가능성은 있음. 배열의 두 원소가 모두 `sys.float_info.max`라면 답도 `sys.float_info.max`여야 하지만, 덧셈 결과는 `inf`가 되고 그걸 2로 나눠도 여전히 `inf`임  
    덧셈에 대해 2로 나누는 걸 분배해서 고치려 할 수 있지만, 그러면 **비정규화 수**에서는 잘못된 답이 나옴. 대부분은 이 문제가 생길 만큼 큰 숫자가 프로그램에 나오지 않는다고 가정하는 듯함. numpy도 여기서는 경고와 함께 `inf`를 냄:  
    ```    
    >>> import sys  
    >>> import numpy  
    >>> numpy.median([sys.float_info.max, sys.float_info.max])  
    .../venv/lib64/python3.11/site-packages/numpy/_core/_methods.py:132: RuntimeWarning: overflow encountered in reduce  
      ret = umr_sum(arr, axis, dtype, out, keepdims, where=where)  
    np.float64(inf)  
    ```

- 실제로 중앙값 자체를 고르는 방법도 여러 가지임. **선형 보간**을 할 건지, 상한을 쓸 건지, 하한을 쓸 건지 같은 선택이 있음  
  그리고 분위수로 넘어가면 몇 시간이고 이야기할 수 있음. 하나만 고르는 것과 여러 개를 한 번에 고르는 것은 접근이 달라져야 함

- 원글 같은 면접 문제는 쓰지 않음. 나는 **부드러움**을 요구하는데, 문제를 푸는 난이도가 후보자의 능력과 경험에 따라 매끄럽게 변해야 한다는 뜻임. 특히 라이브러리 함수나 quickselect, 기수 정렬 같은 알고리즘의 존재를 아느냐가 결과를 급격히 바꾼다면, 측정용으로 좋은 문제가 아님  
  후보자의 경험과 능력을 재는 게 아니라 특정한 **마법 유물**을 아는지 시험하는 셈임. 후속 질문으로 보완할 수는 있지만, 처음부터 더 부드러운 문제를 내는 편이 낫다
  - 공유해 줄 수 있다면, 그런 **부드러운 문제**의 구체적인 예가 매우 궁금함
