16. 중간 난이도 연습문제 16.7 최대 숫자 주어진 두 수의 최댓값을 찾는 메서드를 작성하라. 단, if-else나 비교 연산자는 사용할 수 없다. 16.8 정수를 영어로 정수가 주어졌을 때 이 숫자를 영어 구문으로 표현해주는 프로그램을 작성하라. 예를 들어 1,000이 입력되면 ‘One Thousand’, 234가 입력되면 ‘Two Hundred Thirty Four’를 출력한다. 16.9 연산자 덧셈 연산자만을 사용하여 정수에 대한 곱셈, 뺄셈, 나눗셈 연산을 수행하는 메서드를 작성하라. 연산에 대한 결과는 항상 정수가 되어야 한다.
16. 중간 난이도 연습문제 16.4 틱-택-토의 승자 틱-택-토(tic-tac-toe) 게임의 승자를 알아내는 알고리즘을 설계하라. 16.5 계승(factorial)의 0 n!의 계싼 결과에서 마지막에 붙은 연속된 0의 개수를 계산하는 알고리즘을 작성하라. 16.6 최소의 차이 두 개의 정수 배열이 주어져 있다. 각 배열에서 숫자를 하나씩 선택했을 때 두 숫자의 차이(절댓값)가 최소인 값을 출력하라.
16. 중간 난이도 연습문제 16.1 숫자 교환 임시 변수를 사용하지 않고 숫자를 교환(swap)하는 함수를 작성하라. 16.2 단어 출현 빈도 어떤 책에 나타난 단어의 출현 빈도를 계싼하는 메서드를 설계하라. 이 알고리즘을 여러 번 수행해야 한다면 어떻게 해야 할까? 16.3 교차점 시작점과 끝점으로 이루어진 선분 두 개가 주어질 때, 이 둘의 교차점을 찾는 프로그램을 작성하라.
15. 스레드와 락 스레드로 알고리즘을 구현하라는 문제를 출제하는 일은 흔하지 않음. 하지만 스레드, 특히 교착상태(deadlock)에 대한 일반적 이해도를 평가하기 위한문제느 어떤 회사에서도 상대적으로 자주 출제하는 편임. 자바의 스레드 자바의 모든 스레드는 java.lang.Thread 클래스 객체에 의해 생성되고 제어됨. 독립적인 응용 프로그램이 실행될 때, main() 메서드를 실행하기 위한 하나의 사용자 스레드(user thread)가 자동으로 만들어짐. 이를 주 스레드(main thread) 라고 함. 자바에서 스레드를 구현하는 방법은 2가지가 있음. java.lang.Runnable 인터페이스 구현하기 java.lang.Thread 클래스 상속받기 Runnable 인터페이스를 구현하는 방법 ..
14. 데이터베이스 SQL 질의문에는 수많은 변종이 있음. 여러분은 그 가운데 하나를 사용했을 것임. SQL 문법과 그 변종들 묵시점(implicit) JOIN과 명시적(explicit) JOIN은 둘다 동등함. 어느 쪽을 사용할 것이냐는 개인 취향의 문제임. 비정규화 vs. 정규화 데이터베이스 정규화 데이터베이스는 중복을 최소화하도록 설계된 데이터베이스임. 대신 상당수의 일상적 질의를 처리하기 위해 JOIN을 많이 하게 되는 단점이 있음. 비정규화 데이터베이스는 읽는 시간을 최적화하도록 설계된 데이터베이스임. 대신 데이터베이스에 데이터를 중복해서 저장할 수 있음. 소규모 데이터베이스 설계 면접장에서 데이터베이스를 설계해 보라는 요청을 받을 수 있음. 1단계 : 모호성 처리 데이터베이스에 관계뙨 문제는 ..
12. C와 C++ 좋은 면접관은 지원자에게 익숙하지 않은 언어로 코딩하라고 요구하지 않음. 만약 C++로 코딩해 보라는 요구를 받았다면, 이력서에 C++를 적어놨기 때문임. API를 모두 기억하지 못해도 괜찮지만, 관련된 문제를 쉽게 풀 수 있도록 기본적인 C++ 문법은 공부해 둘 것을 추천함. 클래스와 상속 C++ 클래스는 다른 객체 지향 언어의 클래스와 비슷한 특성을 가짐. C++에서 모든 데이터 멤버와 메서드는 기본적으로 private 임. public 키워드를 사용하여 그 값을 변경할 수 있음. 생성자와 소멸자 생성자 : 객체가 생성되면 자동으로 호출됨. 소멸자 : 객체가 소멸될 때 자동으로 호출됨. 기본값 함수 선언 시, 기본값(default values)을 명시할 수 있음. 반드시 함수 선언..
11. 테스팅 테스팅과 관련된 질문들은 보통 다음 네 가지 범주 중 하나에 속함. 실생활에서 접하는 객체를 테스트하라 소프트웨어 하나를 테스트하라. 주어진 함수에 대한 테스트 코드를 작성하라. 발생한 이슈에 대한 해결책을 찾아내라. 입력 형식이 깔끔하다거나, 사용자가 예측 가능한 행동만 할 것이라고 가정하면 안됨. 아주 이상한 방식으로 시스템이 사용될 수 있으니 그에 대비해야 함. 면접관이 평가하는 것 큰 그림을 이해하고 있는가 테스트케이스 간의 우선순위를 적절히 매길 수 있는가? 퍼즐 조각을 제대로 맞추는 방법을 아는가 소프트웨어가 어떻게 동작하는지 아는가 각 소프트웨어가 보다 더 큰 생태계의 일부로 어떻게 귀속되는지 이해하는가 조직화 문제에 구조적으로 접근하고 있는가 시스템을 구조적으로 잘 나누면 테..
면접 문제 10.5 드문드문 탐색 빈 문자열이 섞여 있는 정렬된 문자열 배열이 주어졌을 때, 특정 문자열의 위치를 찾는 메서드를 작성하라. 10.6 큰 파일 정렬 한 줄에 문자열 하나가 쓰여 있는 20GB짜리 파일이 있다고 하자. 이 파일을 정렬하려면 어떻게 해야 할지 설명하라. 10.7 빠트린 정수 음이 아닌 정수 40억개로 이루어진 입력 파일이 있다. 이 파일에 없는 정수를 생성하는 알고리즘을 작성하라. 단, 메모리는 1GB만 사용할 수 있다. 10.8 중복 찾기 1부터 N(≤32,000)까지의 숫자로 이루어진 배열이 있다. 배열엔 중복된 숫자가 나타날 수 있고, N이 무엇인지는 알 수 없다. 사용 가능한 메모리가 4KB일 때, 중복된 원소를 모두 출력하려면 어떻게 할 수 있을까? 10.9 정렬된 행..
메모 10. 정렬과 탐색 널리 사용되는 정렬 및 탐색 알고리즘을 완벽히 이해하는 건 굉장히 가치 있는 일임. 많은 정렬 및 탐색 문제는 잘 알려진 알고리즘들을 변용하여 출제됨. 여러 가지 정렬 알고리즘의 차이점을 잘 이해하고, 해당 상황에서 어떤 알고리즘이 어울릴지 살펴두는 것이 좋음. 널리 사용되는 정렬 알고리즘 아래 정리한 다섯 알고리즘 가운데, 병합 정렬(merge sort), 퀵 정렬(quick sort), 버킷 정렬(bucket sort)관련 문제가 가장 자주 출제됨. 버블 정렬(bubble sort) | 평균 및 최악 실행 시간 : O(n^2), 메모리 : O(1) 배열의 첫 원소부터 순차적으로 진행하며, 현재 원소가 그다음 원소의 값보다 크면 두 원소를 바꾸는 작업을 반복함. 이런 식으로 배..
메모 9. 시스템 설계 및 규모 확장성 규모 확장성(scalability)은 가장 쉬운 종류의 문제임. 이런 류의 문제들은’마술’ 같은 것이 있지 않고, 단순히 여러분이 실제 세계에서 어떻게 행동할지를 보기 위해 설계된 문제들임. 이런 문제를 풀 떄는 실제 일을 하듯이 하면 됨. 질문을 하고, 면접관을 끌어들여라. 장단점을 토론하라. 시스템 설계는 좋은 해법과 나쁜 해법은 있지만 완벽한 해법은 없음. 문제를 다루는 방법 소통하라. 처음에는 포괄적으로 접근하라. 화이트보드를 사용하라. 면접관이 우려하는 부분을 인정하라. 가정을 할 때 주의하라. 잘못된 가정은 문제를 완전히 다르게 바꿔 버릴 수 있기 때문 여러분이 생각하는 가정을 명확히 언급하라. 필요하다면 어립잡아 보라. 뛰어들라. 이런 문제들은 최고의 ..
면접 문제 8.9 괄호 n 쌍의 괄호로 만들 수 있는 모든 합당한(괄호가 적절히 열리고 닫힌) 조합을 출력하는 알고리즘을 구현하라. 8.10 영역 칠하기 이미지 편집 프로그램에서 흔히 쓰이는 ‘영역 칠하기(paint fill)’ 함수를 구현하라. 영역 칠하기 함수는 화면(색이 칠해진 이차원 배열)과 그 화면상의 한 지점, 그리고 새로운 색상이 주어졌을 때, 주어진 지점과 색이 같은 주변 영역을 새로운 색상으로 다시 색칠한다. 8.11 코인 쿼터(25센트), 다임(10센트), 니켈(5센트), 페니(1센트)의 네 가지 동전이 무한히 주어졌을 때, n센트를 표현하는 모든 방법의 수를 계산하는 코드를 작성하라. 8.12 여덟 개의 퀸 8x8 체스판 위에 여덟 개의 퀸(queen)이 서로 잡아 먹히지 않도록 놓을..
면접 문제 8.4 부분 집합 어떤 집합의 부분 집합을 전부 반환하는 메서드를 작성하라. 8.5 재귀 곱셈 연산자를 사용하지 않고 양의 정수 두 개를 곱하는 재귀 함수를 작성하라. 덧셈(addition), 뺄셈(subtraction), 비트 시프티(bit shifting) 연산자를 사용할 수 있지만 이들의 사용 횟수를 최소화해야 한다. 8.6 하노이타워 전형적인 하노이타워(Towers of Hanoi)에서는 크기가 서로 다른 N개의 원반을 세 개의 기둥 중 아무 곳으로나 옮길 수 있다. 초기에 원반은 크기가 맨 위에서부터 아래로 커지는 순서대로 쌓여 있다. 그리고 이 문제에는 다음과 같은 제약조건이 있다. (1) 원반을 한 번에 하나만 옮길 수 있다. (2) 맨 위에 있는 원반 하나를 다른 기둥으로 옮길 ..