개발자 필수대비 기술면접 질문모음 26가지 - 답안추가
목차
1. 알고리즘
Q-1. 시간복잡도와 공간복잡도가 무엇인지 설명해주실 수 있을까요?
A. 시간복잡도와 공간복잡도 모두 알고리즘의 성능을 분석하기 위한 개념이다.
A-1.
시간복잡도 : 알고리즘이 입력 크기에 따라 소요되는 시간의 증가율, 알고리즘의 최악의 경우 실행시간의 상한을 나타내는 "빅 오(Big O)" 표기법을 사용한다
O(1) : 상수 시간 복잡도. 입력 크기에 상관없이 일정한 실행 시간을 가짐
O(n) : n의 값에 따라 처리수도 1:1 비례해서 늘어남, 반복문
O(n²) : 2번 겹친 이중반복문의 경우 O(n²)로 나타낼 수 있다.
O(n³) : 3번 겹친 삼중반복문
O(nm) : n번 반복문과 m번 반복문을 중첩시키는 경우
O(logn) : 이진 탐색 기법, 탐색을 해나갈 수록 탐색해야 할 데이터가 뚝뚝 떨어지기 때문에 이렇게 표기
A-2.
공간복잡도 : 알고리즘이 실행되는 동안 얼마나 많은 메모리 공간을 사용하는지
입력이 커질 때에도 합리적인 시간과 공간을 유지하는 것이 효율적인 알고리즘
Q-2. 재미있게 공부한 알고리즘이 있다면 설명해주실 수 있을까요?
A. 에라토스테네스의 체 알고리즘을 사용하여 주어진 범위 내의 모든 소수를 찾는 알고리즘.
특정 수의 배수를 지우고 남은 수를 출력하는 공식
function findPrimes(limit) {
const isPrime = new Array(limit + 1).fill(true);
isPrime[0] = isPrime[1] = false;
for (let num = 2; num <= Math.sqrt(limit); num++) {
if (isPrime[num]) {
for (let multiple = num * num; multiple <= limit; multiple += num) {
isPrime[multiple] = false;
}
}
}
const primes = [];
for (let i = 2; i <= limit; i++) {
if (isPrime[i]) {
primes.push(i);
}
}
return primes;
}
const primesUpTo5 = findPrimes(5);
console.log(primesUpTo5); // Output: [2, 3, 5]
Q-3. 포트폴리오에서 시간복잡도를 낮춘 사례가 있다면 설명해주실 수 있을까요?
A. 인덱싱과 캐싱을 사용하여 검색 속도 향상
Q-4. 이분탐색이 무엇이고 시간복잡도는 어떻게 되며 그 이유는 무엇인가요?
A. 오름차순 혹은 내림차순으로 정렬된 수열에서 검색하는 알고리즘. 선형 탐색보다 훨씬 빠르다는 장점이 있고 시간복잡도는 탐색할 범위를 절반으로 줄여서 탐색하므로 O(logn)이다.
- 배열의 가운데 요소의 인덱스를 pivot으로 정한다.
- a[pivot]의 값이 찾고자 하는 요소와 같다면 검색완료
- a[pivot]의 값이 찾는 값보다 크다면 left ~ pivot 사이를 탐색한다.
- a[pivot]의 값이 찾는 값보다 작다면 pivot ~ right 사이를 탐색한다.
아래의 수열에서 이분탐색으로 80을 찾아보자
pivot = (left+right)/2 이다.
left = 0, right = 9, pivot = (0+9)/2 = 4 이다.
a[4] = 45 < 80 보다 작으므로 80은 pivot의 오른쪽에 있을 것이 자명하다.
left = pivot+1 = 5, right = 9, pivot = (5+9)/2 = 7
a[7] = 72 < 80
left = pivot+1 = 8, right = 9, pivot = (8+9)/2 = 8
a[8] = 80 == 80
이므로 3번만에 80을 찾을 수 있다.
Q-5. 시간복잡도가 높은 경우 취할 수 있는 일반 전략을 3가지 정도 설명해주실 수 있을까요? --> 일반 전략이 뭘까?
A. 알고리즘 최적화 및 변경, 분할정복(하위 문제를 독립적으로 해결하고 그 결괄르 결합하여 전체 문제를 해결 ex.병합정렬), 동적 계획법(중복된 하위 문제들을 한번만 계산하고 그 결과를 저장해두고 나중에 재활용하는 방법 ex.최단경로 찾기 등)
병합 정렬 (Merge Sort):
병합 정렬은 "분할 정복" 전략을 기반으로 하는 정렬 알고리즘 중 하나입니다. 아래는 병합 정렬의 주요 단계를 설명한 것입니다:
- 분할(Divide): 정렬할 리스트를 반으로 나눕니다.
- 정복(Conquer): 나뉜 리스트 각각에 대해 재귀적으로 정렬을 수행합니다.
- 병합(Merge): 정렬된 두 개의 하위 리스트를 합쳐서 하나의 정렬된 리스트로 만듭니다.
이 과정을 반복하며 리스트를 계속해서 분할하고 정복하다가 결국에는 하나의 원소를 가진 하위 리스트들을 정렬한 후, 이를 병합하면 전체 리스트가 정렬됩니다. 병합 정렬은 평균적으로 O(n log n)의 시간 복잡도를 가지며, 안정적인 정렬 방식입니다.
피보나치 수열:
피보나치 수열은 이전 두 항을 더하여 다음 항을 만드는 수열입니다. 시작은 0과 1로, 그 다음 항부터는 이전 두 항의 합으로 이루어집니다. 수식으로 나타내면 Fn = Fn-1 + Fn-2 입니다. 피보나치 수열의 처음 몇 항은 다음과 같습니다: 0, 1, 1, 2, 3, 5, 8, 13, 21, ...
피보나치 수열은 재귀적인 형태를 가지며, 특히 재귀 함수를 사용하여 구현할 때 많은 중복 계산이 발생합니다. 이러한 중복 계산을 피하기 위해 동적 계획법을 사용하여 효율적으로 계산할 수 있습니다. 동적 계획법에서는 한 번 계산한 결과를 저장해두고 재활용하여 시간 복잡도를 크게 줄일 수 있습니다.
Q-6. 공간복잡도가 높은 경우 취할 수 있는 일반 전략을 3가지 정도 설명해주실 수 있을까요?
A. 인플레이스 알고리즘(주어진 입력 배열 내에서 작업을 수행하여 공간복잡도를 최소화), 부분적인 데이터 처리(전체 메모리를 동시에 보유하지 않고 작은 chunk로 나누어 처리), 데이터 압축(데이터의 중복성이나 패턴을 이용하여 데이터를 더 작은 형태로 만든다)
2. 자료구조
Q-1. 좋아하는 자료구조가 있다면 이유와 함께 설명해주실 수 있을까요?
A. 해시테이블을 좋아합니다. 해시테이블이란 키-값 쌍을 저장하는 자료 구조로 빠른 검색과 삽입이 가능하며 O(1)의 시간 복잡도를 갖습니다. 해시함수를 통해 키를 인덱스로 변환하기 때문에 메모리를 효율적으로 사용할 수 있습니다.
O(1)의 시간 복잡도란 해시 함수를 1번만 수행하면 되니까ㅇㅇ
O(1)은 데이터가 증가해도 성능에 변함이 없다는 점!!
Q-2. 스택, 큐에 대해 설명해주실 수 있을까요?
A. 스택이란 LIFO 후입선출의 원칙을 따르는 자료구조로 주로 임시 데이터 저장 등에 사용, 큐란 FIFO 원칙을 따르는 자료구조로 프로세스 스케쥴링에 사용된다.
Q-3. 배열, 링크드리스트를 비교하여 설명해주실 수 있을까요?
A. 배열이란 동일한 데이터 타입의 요소들을 순서대로 저장하는 자료구조, 크기가 고정되어 추가/삭제에 제약이 있다. 링크드리스트는 노드들이 서로 연결되어 있는 구조, 삽입과 삭제가 상대적으로 빠르다.
Q-4. 해시테이블의 원리, 충돌 해소 전략에 대해 설명해주실 수 있을까요?
A. 크게 분리연결법(체이닝), 개방주소법 2가지로 나뉜다. 분리연결법은 각각의 인덱스에 연결리스트를 이용하여 중복된 값들을 함께 저장할 수 있는 것. 즉 여러개의 키 밸류 페어를 연결시킨다! 개방주소법이란 충돌이 발생한 경우 찾은 새로운 인덱스에 데이터를 삽입하고 수행하는 것. 충돌하면 다음, 다음으로 계속 반복된다.
아래 영상에서 아주~~~~~설명을 잘 해주시니 참고바람.
https://www.youtube.com/watch?v=ZBu_slSH5Sk
Q-5. 우선순위 큐의 시간복잡도는 어떻게 되며 그 이유는 무엇인지 설명해주실 수 있을까요?
A. 데이터들이 우선순위에 따라 정렬된 상태로 저장되는 자료구조, 우선순위에 따라 삽입되고 삭제된다.
동작방식 : 삽입-삭제, DELETE를 수행하면 가장 우선순위인 큐가 사라지는 것.
일반적으로 이진 힙(Binary Heap)방식으로 구현된다. 이진 힙은 max heap(트리의 모든 부모 노드가 자식보다 큰 숫자), min heap(트리의 모든 부모 노드가 자식보다 작은 숫자) 두가지 종류가 있고 종류에 따라 중요도가 달라지는 것 뿐.
시간복잡도 : 삽입연산시 각 단계마다 현재 노드와 부모 노드를 비교하므로 트리의 높이만큼의 비교를 수행한다. 힙의 높이는 logN에 비례하므로 삽입 연산은 O(logN)의 시간 복잡도를 가진다. 삭제 연산 또한 가장 우선 순위가 높은 요소를 삭제하는 경우, 루트 노드부터 시작하여 자식 노드와 비교하며 맨 마지막 노드를 올바른 위치로 이동시킨다. 이 과정 역시 힙의 높이인 log N에 비례하므로 삭제 연산도 O(logN)의 시간 복잡도를 가진다. 즉 삽입시간과 삭제시간 모두 O(logN)의 시간복잡도를 가진다.
쓰이는 곳 : 프로세스 스케쥴링에서 레디큐에서 가장 우선순위가 높은 것이 CPU에서 실행된다.
3. 데이터베이스
Q. 인덱스란 무엇이고 일반적인 원리는 어떠한지 설명해주실 수 있을까요?
A. 데이터를 빠르게 찾거나 접근하기 위한 개념. 일종의 목차 개념으로 데이터 구조내에서 각 요소가 고유한 위치나 번호를 가지는 시스템. my_list = [1,2,3,4,5] 에서 my_list에 접근하여 1,2,3,4,5를 빠르게 찾아오는 것.
Q. 모든 요소에 인덱스를 걸지 않는 이유는 무엇일까요?
A. 메모리소비(모든 요소에 인덱스를 부여하면 추가 메모리 공간이 필요), 데이터 유지 및 일관성(데이터의 요소를 변경하려면 인덱스도 함께 조정해야함, 데이터의 일관성 유지하기 어려움)
Q. 복합 인덱스란 무엇인지 원리를 설명해주실 수 있을까요?
A. 두 개 이상의 컬럼을 합쳐서 인덱스를 만드는 것.
SELECT 카드번호, 결제금액
FROM 거래명세서
WHERE 카드번호 = '1234'
AND 거래날짜 BETWEEN '20230105'
AND '20230105'
위와 같이 인덱스를 카드번호로만 설정했다면 수많은 결제내역을 불러오는데 많은 처리를 해야할 것이다.
따라서 카드번호와 카드날짜를 복합 인덱스로 구성하면 효과적이게 데이터를 탐색할 수 있음.
Q. 트랜잭션이란 무엇이고 원자성, 일관성, 고립성, 지속성이란 무엇인지 설명해주실 수 있을까요?
A. 데이터베이스 관리 시스템에서 수행되는 하나의 작업 단위. (추가, 수정, 삭제, 쿼리 등등)이런 조작들이 모두 성공적으로 완료되거나 실패하면 전체 작업이 완료되거나 롤백 되는 특성을 갖는다.
트랜잭션은 ACID 즉 원자성, 일관성, 고립성, 지속성을 통해 데이터의 일관성, 무결성, 동시성 제어 등을 보장한다.
원자성(Atomicity) : 트랜잭션은 하나의 논리적인 작업 단위로 간주되며, 모든 조작이 완료되거나 아무것도 수행되지 않은 초기 상태로 롤백된다.
일관성(Consistency) : 트랜잭션 이전과 이후에도 데이터베이스가 일관된 규칙과 제약 조건을 따른다.
고립성(Isolation) : 동시에 여러개의 트랜잭션이 실행될 때 각 트랜잭션이 서로의 작업에 영향을 주지 않는다.
지속성(Durabillity) : 트랜잭션이 완료된 후에는 그 결과가 영구적으로 저장되어야한다.
Q. 정규화란 무엇이고 대표적인 장점과 단점은 무엇이 있을까요?
A. 정규화란 데이터 설계과정에서 중복을 최소화하고 구조화하는 프로세스. Codd라는 규칙을 따르며 1차부터 6차까지 단계적으로 이루어진다. 목적은 중복제거, 이상현상제거. ==> 과도한 정규화는 조인 연산의 복잡도가 증가하고 쿼리 성능이 저하될 수 있다
4. 네트워크
Q. HTTPS의 원리를 설명해주실 수 있을까요?
A. HTTPS란 인터넷을 통해 정보를 안전하게 전송하기 위한 프로토콜.
1. 웹사이트 소유자는 인증기관에 인증서를 요청하고 발급받은 인증서를 웹 서버에 설치한다.
2. 사용자가 웹 브라우저를 통해 HTTPS로 보호된 웹사이트에 접속하면서 요청을 보낸다.
3. 사용자 브라우저로 받은 요청을 받아 서버가 발급받은 인증서를 제공한다.
4. 사용자 브라우저는 이 인증서를 확인하고 유효하다면 암호화된 통신을 시작한다.
5. 브라우저와 웹서버간의 통신은 공개키/비밀키 암호화 방식을 사용하는데 서버는 공개키를 브라우저에게 제공하고, 브라우저는 이 공개키를 사용하여 암호화된 데이터를 웹서버로 보낼 수 있다. 웹서버는 자신의 비밀키를 사용하여 이 데이터를 해독한다.
6. 이후 모든 데이터는 암호화된 상태로 이루어진다.
Q. TCP 3 way handshake란 무엇인지 설명해주실 수 있을까요?
A. TCP 프로토콜을 사용하여 통신을 시작하는 과정. SYN->SYN/ACK->ACK
1. SYN(Synchronization) : SYN(x)를 보내며 연결요청
2. SYN+ACK(Acknowledgement) : SYN(y) 패킷과 동기화 요청에 대한 답변을 보냄, 너희도 포트 열어줘
3. ACK : 수락 확인을 보내며 Port 의 Server가 Established 됌
Q. TCP 와 UDP 를 비교하여 설명해주실 수 있을까요?
A.
TCP
- 인터넷 상에서 데이터를 메세지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜
- 신뢰적이고 연결지향성
- TCP와 IP는 함께 사용되는데, IP는 배달, TCP는 패킷의 추적 및 관리를 한다
- 3-way handshaking 과정을 통해 연결을 설정
- 지연시간이 크다
- 신뢰가 보장되야할 파일 전송, 이메일, 웹브라우징 등
UDP
- 데이터를 패킷단위로 전송
- 비신뢰성, 연결지향적이지 않다
- 오류 복구 없이 발생해도 넘어감
- 지연시간이 작다
- 음성 통화, 동영상 스트리밍 등
Q. CORS란 무엇이고 어떻게 구현할 수 있나요? Cross Origin Resource Sharing
A. 브라우저에서 보안적인 이유로 cross-origin HTTP 요청들을 제한한다. 하지만 웹 애플리케이션에서는 때로 다른 도메인이나 포트에서 제공되는 리소스(예: API 데이터)에 접근해야 할 경우가 있다. CORS는 서버와 클라이언트 간에 특정 조건을 만족하면 다른 출처의 리소스에 접근할 수 있도록 허용하는 메커니즘이다. 이러한 허락을 구하고 거절하는 메커니즘을 HTTP-header를 통해서 가능한데 이를 CORS(Cross origin Resource Sharing)이라고 한다.
*cross origin 이란 다음중 한가지라도 다른 경우를 말함
1. 프로토콜 - http와 https는 프로토콜이 다르다.
2. 도메인 - domain.com 과 other-domain.com은 다르다.
3. 포트 번호 - 8080 포트와 3000포트는 다르다.
*대표적인 CORS 설정 법
서버에서 응답 헤더에 CORS 관련 정보를 설정한다.
Access-Control-Allow-Origin: *
*CORS의 동작방식
1. 서버로 요청을 한다.
2. 서버의 응답이 왔을 때 브라우저가 요청한 Origin과 응답한 헤더 Access-Control-Request-Headers의 값을 비교하여 유효한 요청이라면 리소스를 응답한다. 만약 유효하지 않은 요청이라면 브라우저에서 이를 막고 에러가 발생한다.
Q. CORS가 왜 필요한가?
A. CORS 없이 모든 곳에서 데이터를 요청할 수 있게 되면 다른 사이트에서 원래 사이트를 흉내낼 수 있게 되고, 이를 통해 사용자들이 로그인했던 세션을 탈취하여 악의적으로 정보를 추출할 수 있다.
5. 기타
Base64 인코딩이란 무엇인가요?
사용자 패스워드를 전송하고 보관하는 방법을 설명해주실 수 있을까요?
프로세스와 스레드를 비교하여 설명해주실 수 있을까요?
프로세스 : 독립된 메모리 공간, 운영체제로부터 독립된 자원 할당, 다른 프로세스에 영향x, 안정성
스레드 : 프로세스 내에서 실행, 공유 메모리 공간, 다른 스레드에 영향
멀티 프로세스 vs 멀티 스레드를 비교하여 설명? (둘 다 동시에 여러가지 작업을 수행하기 위한 방법)
멀티 프로세스 : 프로세스간의 자원 공유가 어렵고 자원 소모가 크다
멀티 스레드 : 효율적으로 자원 활용 가능하지만 동기화 문제 발생
동기와 비동기를 비교하여 설명해주실 수 있을까요?
Call by reference란 무엇이고 보통 어떻게 쓰이나요?
동시성과 병렬성을 비교하여 설명해주실 수 있을까요?
Node.js 의 동작방식 (단일 스레드, 이벤트 루프 위주로) 설명 해주세요Node.js는 단일 스레드(콜스택이 하나)에서 작동하며 이벤트 단위로 비동기적으로 작동합니다. 자바스크립트에서 비동기 작업을 요청하면 백그라운드에서 작업이 진행되고 call back queue에 함수가 등록됩니다.
call stack 이 비게 되면 이벤트루프가 콜을 call stack으로 넣어 실행해줍니다. 그렇게 해서 비동기 작업이 가능하다.Javascript를 선택한 이유 : 궁극적인 목표가 풀스택인데 웹 프론트엔드와 백엔드에서의 일관성이 매력적으로 다가왔습니다. 또한 프레임워크와 라이브러리가 잘 갖춰져있어서,.
'개발 > 개발자 취업준비' 카테고리의 다른 글
개발자 필수 대비 단골 면접 질문 6가지 (0) | 2023.09.06 |
---|---|
모의면접 .. 후.. (0) | 2023.08.23 |
개발자 필수대비 기술면접 질문모음 26가지 (0) | 2023.08.23 |
개발자 필수대비 인성면접 질문모음 (0) | 2023.08.23 |
Node.js 백엔드 개발자 면접 질문 정리 1 (RDS, Restful API, 세션과 쿠키, Status Code 200, 400, 500) (2) | 2023.08.22 |