Vue.js 미드레벨 코딩·알고리즘 면접
새 면접Q. Vue 애플리케이션에서 사용자의 브라우징 히스토리를 관리하는 기능을 구현합니다. 방문한 페이지를 스택으로 관리하면서 '뒤로가기'와 '앞으로가기'를 모두 지원해야 합니다. 이 요구사항을 만족하는 자료구조와 알고리즘을 설계하고, 각 연산(방문, 뒤로가기, 앞으로가기)의 시간 복잡도를 설명해주세요.
두 개의 스택을 활용하면 양방향 탐색이 가능합니다.
두 개의 스택(backStack, forwardStack)을 사용하여 구현합니다. 새 페이지 방문 시 현재 페이지를 backStack에 push하고 forwardStack을 비웁니다. 뒤로가기 시 backStack에서 pop하여 현재 페이지로 설정하고, 이전 현재 페이지는 forwardStack에 push합니다. 앞으로가기는 반대로 forwardStack에서 pop하여 현재 페이지로 설정하고, 이전 현재 페이지는 backStack에 push합니다. 모든 연산은 스택의 push/pop만 사용하므로 O(1) 시간 복잡도를 가집니다. Vue의 반응성 시스템과 함께 사용할 때는 배열 대신 ref로 감싼 배열을 사용하여 UI가 자동으로 업데이트되도록 합니다.
- • 두 개의 스택을 사용한 양방향 탐색 구현
- • 새 방문 시 forwardStack 초기화
- • 모든 연산의 O(1) 시간 복잡도
- • Vue 반응성 시스템과의 통합
브라우저의 뒤로가기/앞으로가기 기능이나 텍스트 에디터의 Undo/Redo 기능 구현에 활용됩니다.
만약 방문 기록에 제한(예: 최대 50개)을 두어야 한다면 어떻게 구현하시겠습니까?
Q. Vue 컴포넌트에서 대용량 배열(100만 개 항목)에서 특정 조건을 만족하는 상위 K개의 요소를 찾아야 합니다. 예를 들어 판매량 상위 100개 상품을 찾는 경우입니다. 전체 정렬 대신 더 효율적인 알고리즘을 제안하고, 시간 복잡도와 공간 복잡도를 비교 분석해주세요.
힙 자료구조를 활용하면 전체 정렬 없이 상위 K개를 효율적으로 찾을 수 있습니다.
Min Heap을 사용하여 크기 K로 제한하는 방식이 효율적입니다. 배열을 순회하면서 힙의 크기가 K 미만이면 요소를 추가하고, K에 도달한 후에는 현재 요소가 힙의 최소값보다 크면 최소값을 제거하고 현재 요소를 추가합니다. 전체 정렬은 O(N log N) 시간 복잡도를 가지지만, Min Heap 방식은 O(N log K) 시간 복잡도를 가집니다. K가 N보다 훨씬 작을 때 큰 성능 이점이 있습니다. 공간 복잡도는 O(K)로 전체 배열을 복사하지 않아도 됩니다. JavaScript에서는 힙을 직접 구현하거나 우선순위 큐 라이브러리를 사용할 수 있으며, Vue의 computed 속성으로 감싸 반응형으로 만들 수 있습니다.
- • Min Heap을 활용한 Top K 알고리즘
- • O(N log K) 시간 복잡도로 최적화
- • O(K) 공간 복잡도
- • 전체 정렬 대비 K << N일 때 효율적
대시보드에서 실시간 랭킹, 인기 검색어, 베스트 상품 등을 효율적으로 표시할 때 사용됩니다.
만약 데이터가 실시간으로 계속 추가되는 스트리밍 환경이라면 어떻게 구현을 변경해야 할까요?
Q. Vue 애플리케이션의 검색 기능에서 사용자 입력어에 오타가 있어도 유사한 결과를 찾아주는 기능을 구현해야 합니다. 두 문자열 간의 유사도를 측정하는 알고리즘들(편집 거리, Levenshtein Distance 등)을 설명하고, 이를 대량의 데이터에 적용할 때 성능을 개선하는 방법을 제안해주세요.
동적 프로그래밍으로 편집 거리를 계산하고, 사전 필터링으로 비교 대상을 줄일 수 있습니다.
Levenshtein Distance는 두 문자열을 같게 만들기 위해 필요한 최소 편집 연산(삽입, 삭제, 치환) 횟수를 계산합니다. 동적 프로그래밍을 사용하여 O(m*n) 시간 복잡도로 계산할 수 있으며, 공간 복잡도는 O(min(m,n))로 최적화 가능합니다. 대량 데이터에 적용 시 성능 개선 방법으로는 첫째, 문자열 길이 차이가 임계값을 초과하면 조기 종료, 둘째, N-gram 인덱싱으로 후보군을 먼저 필터링, 셋째, BK-Tree 같은 메트릭 트리 구조 활용, 넷째, Web Worker로 병렬 처리 등이 있습니다. Vue 컴포넌트에서는 debounce를 적용하여 입력마다 계산하지 않고, computed 속성으로 캐싱하여 불필요한 재계산을 방지할 수 있습니다.
- • Levenshtein Distance의 동적 프로그래밍 구현
- • O(m*n) 시간, O(min(m,n)) 공간 복잡도
- • N-gram 인덱싱과 조기 종료로 최적화
- • debounce와 캐싱으로 Vue 성능 개선
검색 자동완성, 오타 교정, 중복 데이터 탐지, 추천 시스템에서 유사도 측정에 활용됩니다.
한글의 경우 초성 검색을 지원하려면 어떤 추가 로직이 필요할까요?
Q. Vue 애플리케이션에서 조직도를 트리 구조로 표시하는데, 특정 직원으로부터 모든 하위 직원까지의 관계를 찾고, 두 직원 간의 최단 보고 경로를 찾아야 합니다. DFS와 BFS의 차이점을 설명하고, 각 요구사항에 어떤 알고리즘이 적합한지, 그리고 순환 참조가 있을 수 있는 경우 어떻게 처리해야 하는지 설명해주세요.
트리 순회는 DFS가 직관적이고, 최단 경로는 BFS가 보장하며, 방문 체크로 순환을 방지합니다.
DFS는 스택(또는 재귀)을 사용하여 한 경로를 끝까지 탐색한 후 백트래킹하며, 메모리 효율적이고 경로 추적이 쉽습니다. BFS는 큐를 사용하여 레벨 단위로 탐색하며, 최단 경로를 보장합니다. 하위 직원 찾기는 DFS가 적합하며 O(V+E) 시간 복잡도로 모든 노드를 방문합니다. 두 직원 간 최단 경로는 BFS를 사용하여 첫 번째로 도달한 경로가 최단 경로임을 보장합니다. 순환 참조 처리를 위해 Set이나 Map으로 방문한 노드를 추적하고, 방문 전 체크하여 무한 루프를 방지합니다. Vue에서 구현 시 reactive Set을 사용하여 방문 상태를 UI에 반영할 수 있고, 대규모 조직도는 가상 스크롤과 지연 로딩을 결합하여 성능을 최적화합니다.
- • DFS는 경로 추적과 메모리 효율, BFS는 최단 경로 보장
- • 하위 직원 탐색은 DFS, 최단 경로는 BFS
- • Set을 활용한 방문 체크로 순환 참조 방지
- • O(V+E) 시간 복잡도
조직도, 파일 시스템 탐색, 소셜 네트워크 분석, 의존성 그래프 해석에 활용됩니다.
만약 조직도에 가중치(예: 보고 단계별 중요도)가 있다면 어떤 알고리즘을 사용해야 할까요?
Q. Vue 애플리케이션에서 사용자가 선택한 여러 상품의 조합이 특정 금액에 최대한 가까운 조합을 찾는 기능을 구현합니다(예: 10만원 상품권으로 최대한 많이 구매). 이는 배낭 문제(Knapsack Problem)의 변형입니다. 완전 탐색과 동적 프로그래밍 접근법의 차이를 설명하고, 실무에서 적용 가능한 최적화 전략을 제안해주세요.
동적 프로그래밍의 메모이제이션으로 중복 계산을 제거하고, 근사 알고리즘으로 실시간 응답을 보장할 수 있습니다.
완전 탐색(Brute Force)은 모든 조합을 확인하여 O(2^n) 시간 복잡도를 가지며 상품 수가 20개만 넘어도 비현실적입니다. 동적 프로그래밍은 하위 문제의 최적해를 저장하여 O(n*W) 시간 복잡도로 개선하며, 여기서 W는 목표 금액입니다. 2차원 배열로 dp[i][w]를 '첫 i개 상품으로 금액 w를 만드는 최적해'로 정의합니다. 실무 최적화 전략으로는 첫째, 금액을 100원 단위로 정규화하여 W를 줄이기, 둘째, 상품 수가 많으면 가격 대비 가치가 높은 상위 N개만 선택하는 그리디 근사, 셋째, Web Worker로 계산을 백그라운드 처리, 넷째, 결과를 캐싱하여 동일 조건 재요청 시 즉시 반환 등이 있습니다. Vue에서는 computed와 useMemo 패턴으로 불필요한 재계산을 방지합니다.
- • 완전 탐색 O(2^n) vs 동적 프로그래밍 O(n*W)
- • 메모이제이션으로 중복 계산 제거
- • 금액 정규화와 그리디 근사로 실용성 확보
- • Web Worker와 캐싱으로 사용자 경험 개선
쿠폰 최적 사용, 예산 내 최대 구매, 리소스 할당 최적화, 광고 예산 배분에 활용됩니다.
상품마다 수량 제한이 있는 경우(Bounded Knapsack)는 알고리즘을 어떻게 수정해야 할까요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!