[면접대비] 1.취업지원주차 기술

lionloopy·2023년 4월 24일
0

면접대비

목록 보기
1/1

알고리즘

1. 시간복잡도와 공간복잡도가 무엇인지 설명해주실 수 있을까요?
: 시간복잡도는 특정 알고리즘이 어떤 문제를 해결하는 데 걸리는 시간을 의미하고, 공간복잡도는 작성한 프로그램이 얼마나 많은 메모리 공간을 차지하느냐를 의미합니다. 시간복잡도와 공간복잡도가 낮을 수록 좋습니다. 하지만 최근에는 컴퓨터의 성능이 올라가게 되면서 공간복잡도의 중요성은 조금 더 낮아졌습니다.
2. 재미있게 공부한 알고리즘이 있다면 설명해주실 수 있을까요?
: 코딩테스트를 연습했을 때, 콜라츠 추측이라는 알고리즘을 접했던 적이 있습니다. 주어진 수가 1이 될 때 까지 정해진 과정을 수행해야 하는 문제였는데 이 때 for문에만 빠져 있어 쉬운 while을 떠올리지 못해 끙끙 문제를 풀었던 기억이 있습니다. 그러나 while문으로 쉽게 풀고 나니 성취감에 뿌듯했었고 while문이 새롭게 다가와 다시 공부했던 기억이 있습니다. 어렵게만 생각했던 알고리즘이 다른 메소드를 사용하니 쉽게 풀려 재밌었던 기억이 있습니다
3. 포트폴리오에서 시간복잡도를 낮춘 사례가 있다면 설명해주실 수 있을까요?
: 저희 프로젝트에서 수많은 input값을 사용하는 부분이 있었는데, 그에 따라 useState도 많이 사용하게 되었습니다. 하지만 useInput 커스텀훅을 만들어서 불필요한 input렌더링을 막고, 코드를 더 간결하게 만들었던 사례가 있습니다. 또한 React.Lazy와 suspense를 활용하여 필요하지 않은 코드를 로딩하지 않도록 하여 시간복잡도를 낮췄습니다.
4. 이분탐색이 무엇이고 시간복잡도는 어떻게 되며 그 이유는 무엇인가요?
: 이분 탐색은 중간값과 찾으려는 값의 대소를 비교한 뒤 탐색 범위를 반으로 줄여가며 값을 찾는 탐색 알고리즘입니다. 내가 찾고자 하는 값이, 정렬된 배열의 중간 값보다 크면 중간값을 포함한 하위 값들은 탐색 대상에서 제외시키고, 반대로 찾고자 하는 값이 배열의 중간 값보다 작으면 중간 값을 포함한 상위 값들을 탐색에서 제외시키는 방식입니다. 중간을 기준으로 탐색 대상을 줄여나가기 때문에 시간 복잡도는 상대적으로 빠른 알고리즘에 속합니다.
5. 시간복잡도가 높은 경우 취할 수 있는 일반 전략을 3가지 정도 설명해주실 수 있을까요?
: 첫번째로는 불필요한 렌더링을 막기 위해 React.memo 등을 활용할 수 있습니다. 두번째로는 이미지를 최적화 시켜 렌더링 시간을 줄일 수 있습니다. 이미지의 크기가 클 수록 렌더링 시간도 길어지기 때문에 이미지의 크기를 줄이는 것도 시간복잡도를 낮출 수 있습니다. 세번째로는 무분별한 라이브러리 사용을 줄이는 것 입니다. 필요하지 않은 라이브러리 설치는 시간복잡도를 낮출 수 있기 때문에 정리하는 것이 필요합니다.
6. 공간복잡도가 높은 경우 취할 수 있는 일반 전략을 3가지 정도 설명해주실 수 있을까요?
: 첫번째로는 컴포넌트를 분할하여 필요한 부분만 렌더링하도록 구성할 수 있습니다. 이를 통해 메모리 사용을 줄이고, 공간 복잡도를 낮출 수 있습니다. 두번째로는 코드를 최적화하여 메모리 사용을 줄일 수도 있습니다. 예를 들어, 변수를 선언할 때 불필요한 변수를 생성하지 않거나, 캐시를 사용하여 중복된 연산을 줄일 수 있습니다. 세번째로는 무분별한 라이브러리 사용을 줄이는 것 입니다. 필요하지 않은 라이브러리 설치는 많은 메모리를 차지할 수 있기 때문에 정리하는 것이 필요합니다.

자료구조

1. 좋아하는 자료구조가 있다면 이유와 함께 설명해주실 수 있을까요?
: 자료구조 중에서 배열을 좋아합니다. 배열을 좋아하는 이유는 인덱스를 사용하여 순차적으로 데이터들이 정렬되기 때문에 인덱스로 접근하기가 쉽고, 다양한 메소드를 사용하여 활용할 수 있기 때문입니다.
2. 스택, 큐에 대해 설명해주실 수 있을까요?
: 스택은 순서대로 쌓아 올린 형태의 자료구조로, 삽입되는 순서대로 위에 쌓이는 방식입니다. 가장 마지막에 삽입된 자료가 가장 먼저 삭제되는 구조입니다. 큐는 한쪽에서는 삽입이, 한쪽에서는 삭제가 이루어지는 방식입니다. 스택과는 반대로 가장 먼저 삽입된 자료가 가장 먼저 삭제되는 구조입니다. 스택은 웹 브라우저 뒤로가기, 실행취소 등에서 활용되고, 큐는 우선순위가 같은 작업이 예약될 때 활용됩니다.
3. 배열, 링크드리스트를 비교하여 설명해주실 수 있을까요?
: 배열은 입력된 데이터들이 메모리 공간에서 연속적으로 저장되어 있는 자료구조이고, 링크드리스트는 여러개의 노드들이 순차적으로 연결된 자료구조입니다. 따라서, 배열은 연속적인 특징을 갖기 때문에 인덱스를 통한 접근이 용이합니다. 하지만 링크드리스트의 경우 연속적이지 않으므로 처음부터 탐색을 진행해야 한다는 특징이 있습니다. 배열은 데이터의 삽입과 삭제가 적으면서 빠른 접근이 요구될 때, 링크드리스트는 삽입과 삭제가 잦고 검색 빈도가 적을 때 용이합니다.
4. 해시테이블의 원리, 충돌 해소 전략에 대해 설명해주실 수 있을까요?
: 해시테이블은 key-value 쌍으로 데이터를 저장하는 자료구조입니다. 해시테이블은 먼저 해시 함수를 통해 키를 고정된 길이의 인덱스로 변환하고, 인데스에 해당하는 배열의 공간에 값을 저장합니다. 그리고 값을 검색할 때 키를 해시 함수에 넣어 인덱스를 생성하는 원리로 작동합니다. 하지만 데이터가 많아지면, 다른 데이터가 동일한 해시 값을 가르키는 해시 충돌 현상이 발생합니다. 해시 충돌현상을 해결하기 위한 전략으로, Open Addressing 방식은 비어있는 인덱스에 값을 할당하는 방식으로 모든 인덱스에 값이 할당 되어 있는 경우 resizing 방식으로 해시 테이블의 크기를 늘려 해결합니다.
5. 우선순위 큐의 시간복잡도는 어떻게 되며 그 이유는 무엇인지 설명해주실 수 있을까요?
: 우선순위 큐는 데이터를 우선순위에 따라 저장하고, 가장 높은 우선순위를 가지는 데이터를 먼저 꺼내는 자료구조입니다. 우선순위 큐의 시간 복잡도는 삽입, 삭제 시에는 높은 시간 복잡도를 가지고, 검색시에는 낮은 시간 복잡도를 가집니다. 우선순위 큐는 일반적으로 힙(Heap)이라는 자료구조를 이용하여 구현되는데, 힙은 부모 노드와 자식 노드 간에 우선순위가 정해져 있는 완전 이진 트리입니다. 이러한 구조로 인해, 삽입과 삭제 연산이 빠르게 수행될 수 있습니다. 하지만 검색 연산은 가장 높은 우선순위를 가지는 데이터를 찾는 것이므로, 저장된 데이터들을 순차적으로 탐색해야해서 데이터의 개수에 비례하여 시간이 걸리기 때문입니다.

데이터베이스

1. 인덱스란 무엇이고 일반적인 원리는 어떠한지 설명해주실 수 있을까요?
: 인덱스는 어떤 데이터가 어디에 위치해 있는지에 대한 정보를 가진 주소록과 같은 것 입니다. 인덱스는 키와 해당 키의 값이 저장된 레코드의 주소를 포함하는 자료구조로 테이블에 인덱스를 생성하면, 데이터베이스는 인덱스 내의 key값과 매칭되는 레코드 주소를 찾아내고, 이렇게 찾아낸 레코드의 주소를 이용하여 실제 데이터를 읽어와 사용자에게 반환하는 원리로 작동합니다.
2. 모든 요소에 인덱스를 걸지 않는 이유는 무엇일까요?
: 만약 테이블의 수가 적다면, 인덱스를 경유하기 보다는 테이블 전체를 스캔하는 것이 더 빠르므로, 인덱스 생성을 지양합니다. 따라서 모든 요소에 인덱스를 걸면 성능이 떨어질 수 있으므로 모든 요소에 인덱스를 걸지는 않습니다.
3. 복합 인덱스란 무엇인지 원리를 설명해주실 수 있을까요?
: 복합인덱스란, 두 개 이상의 컬럼을 합쳐서 인덱스를 만드는 것으로, 하나의 컬럼으로 인덱스를 만들었을 때 보다 더 적은 데이터 분포를 보이며 탐색할 데이터 수가 줄어드는 경향이 있습니다. 또한 AND 조건으로 검색되는 경우 성능에 중요한 역할을 합니다.
4. 트랜잭션이란 무엇이고 원자성, 일관성, 고립성, 지속성이란 무엇인지 설명해주실 수 있을까요?
: 트랜잭션은, 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미합니다.
원자성은 트랜잭션 내 모든 명령은 반드시 완벽히 수행되어야 하며, 오류가 하나라도 발생시 트랜잭션 전부가 취소되어야 하는 성질입니다.
일관성은 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환하는 성질입니다.
고립성은 수행중인 트랜잭션이 완전히 완료될 때까지 다른 트랜잭션에서 수행결과를 참조할 수 없는 성질입니다.
지속성은 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 하는 성질입니다.
5. 정규화란 무엇이고 대표적인 장점과 단점은 무엇이 있을까요?
: 정규화는 중복을 최소화하도록 설계된 데이터베이스를 말합니다. 정규화의 장점은 중복의 최소화로 저장공간의 효율성을 높일 수 있습니다. 또한 불필요한 로직을 없앨 수 있습니다. 단점은 릴레이션 분해로 릴레이션간의 연산이 많아진다는 단점이 있습니다.

네트워크

1. HTTPS의 원리를 설명해주실 수 있을까요?
: HTTPS는 HTTP에 데이터 암호화가 추가된 프로토콜입니다. 서버는 개인키와 공개키 두개를 가지고 있고, 클라이언트에서 요청시 공개키를 전달해줍니다. 이 공개키로 암호화된 데이터는 서버가 가지고 있는 개인키로만 복호화가 가능해 안전하게 데이터를 사용할 수 있게 됩니다.
2. TCP 3 way handshake란 무엇인지 설명해주실 수 있을까요?
: TCP 3 way handshakes는 통신을 하는 브라우저와 웹 서버가 서로 암호화 통신을 시작할 수 있도록 신분을 확인하고, 필요한 정보를 클라이언트와 서버가 주거니 받거니 하는 과정을 말합니다. 클라이언트는 서버에게 접속요청을 위한 메세지를 보내고, 서버는 클라이언트에게 메세지를 받은 다음
연결을 수락합니다. 이후 클라이언트는 서버에게 접속 수락 확인을 보냅니다. 이렇게 TCP연결이 성립되게 됩니다.
3. TCP 와 UDP 를 비교하여 설명해주실 수 있을까요?
: TCP와 UDP는 네트워크 계층 중 전송계층에서 사용하는 프로토콜입니다.
TCP는 장치들 사이에 논리적인 접속을 성립하기 위해 연결을 설정하여 신뢰성을 보장하는 연결형 서비스입니다. 프로그램간의 메세지를 안정적으로 순서대로 에러없이 교환할 수 있게 합니다.
UDP는 비연결형 프로토콜로 연결 없이 통신이 가능합니다. 데이터의 재전송이 없고 메세지를 일방적으로 전달합니다.
즉, 신뢰성이 요구되는 애플리케이션에는 TCP를 사용하고, 간단한 데이터를 빠른 속도로 전송하고자 하는 애플리케이션에서는 UDP를 사용합니다.
(전송계층:IP에 의해 전달되는 패킷의 오류를 검사하고 재전송 요구 등 제어를 담당하는 계층)
4. CORS란 무엇이고 어떻게 구현할 수 있나요?
: CORS란 한 출처에서 실행중인 웹 애플리케이션이 다른 출처의 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제입니다. 즉, 다른 출처에 리소스를 요청하는 것을 허용하는 정책을 말합니다. 허용하는 방법은 서버에서의 설정으로 허용할 수 있습니다.

기타

1. Base64 인코딩이란 무엇인가요?
: Binary data를 text로 변경하여 다른 형태나 형식으로 변환하는 처리 방식을 말합니다. HTML또는 email과 같이 문자를 위한 미디어에 Binary Data를 포함해야 될 필요가 있을 때, 포함된 Binary Data가 시스템 독립적으로 동일하게 전송되는 걸 보장하기 위해 사용합니다.
2. 사용자 패스워드를 전송하고 보관하는 방법을 설명해주실 수 있을까요?
: 회원가입 시 유저로부터 패스워드를 요청 받으면, 단방향 해시 함수로 암호화 하여 서버에 보관합니다. 이후 로그인 시 유저로부터 패스워드를 받으면 마찬가지로 암호화하여 DB에 저장했던 패스워드와 비교합니다.
3. 프로세스와 스레드를 비교하여 설명해주실 수 있을까요?
: 프로세스는 프로그램을 실행하는 순간 해당 파일이 컴퓨터 메모리에 올라가게 되고, 이 동적인 상태의 프로그램을 프로세스라고 하고, 스레드는 프로세스를 구성하는 더 작은 실행 단위의 개념입니다. 프로세스는 메모리에 올라갈 때 운영체제로부터 독자적인 시스템 자원을 할당 받는 반면, 스레드는 프로세스 내부에서 다른 메모리 영역을 같은 프로세스 내 다른 스레드와 공유한다는 차이가 있습니다.
4. 동기와 비동기를 비교하여 설명해주실 수 있을까요?
: 동기는 요청과 그 결과가 동시에 일어나는 것이고, 비동기는 요청과 결과가 동시에 일어나지 않을거라는 약속을 말합니다. 동기방식은 설계가 매우 간단하고 직관적이지만, 결과가 주어질 때까지 아무것도 못하고 대기해야 하는 단점이 있고, 비동기 방식은 동기보다 복잡하지만, 결과가 주어지는데 시간이 걸리더라도 그 시간 동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있다는 장점이 있습니다.
5. Call by reference란 무엇이고 보통 어떻게 쓰이나요?
: call by reference는 참조에 의한 호출로, 함수에서 값을 전달하는 대신 주소값을 전달하는 방식을 말합니다. 복사하지 않고 직접 참조를 하기 때문에 빠르다는 장점이 있지만, 직접 참조를 하며 원래 값이 영향을 받는다는 위험성이 있습니다.
6. 동시성과 병렬성을 비교하여 설명해주실 수 있을까요?
: 동시성은 여러 작업이 겹치는 기간에 실행될 수 있음을 의미합니다. 동시에 실행하는 것이 아니라, CPU가 작업마다 시간을 적절하게 분할하여 동시에 실행되는 것 처럼 보이게 하는 것 입니다. 이로써 작업을 하지 않는 시간을 최소화 할 수 있습니다.
병렬성은 실제로 동일한 시간에 독립적인 작업을 실행할 수 있음을 의미합니다. 여러 작업을 다른 프로세스 등에서 동시에 실행할 수 있습니다. 따라서 한 번에 많은 일을 처리합니다.

profile
Developer ʕ ·ᴥ·ʔ ʕ·ᴥ· ʔ

0개의 댓글