-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
b7a8cb4
commit c1567ed
Showing
5 changed files
with
418 additions
and
0 deletions.
There are no files selected for viewing
41 changes: 41 additions & 0 deletions
41
CrackingtheCodingInterview/2.Linked List/unit2_LinkedList.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
# Unit 2: Linked List | ||
|
||
|
||
|
||
### 📋 contents | ||
|
||
- Problem 1 : 중복없애기 | ||
|
||
- Problem 2 : 뒤에서 K번째 원소 구하기 | ||
|
||
- Problem 3 : 중간 노드 삭제 | ||
- Problem 4 : 분할 | ||
- Problem 5 : 리스트의 합 | ||
- Problem 6 : Palindrome | ||
- Problem 7 : 교집합 | ||
- Problem 8 : 루프 발견 | ||
|
||
----- | ||
|
||
#### 📝 사전지식(prior knowledge) | ||
|
||
1. *아스키 코드의 총 개수는 128개이다. (문자, 숫자, 특수기호 등등)* | ||
2. *bitset의 이름이 b인 경우 `b.test(n)`은 b의 인덱스 n의 비트값이 0인지 1인지 검사한다.* | ||
3. *bitset의 이름이 b인 경우, `b.set(n)`은 인덱스 n의 비트값을 1로 설정한다.* | ||
|
||
--------- | ||
|
||
## Problem 1: 중복 없애기 | ||
|
||
정렬되어 있지 않은 연결리스트가 주어졌을 때, 이 리스트에서 중복되는 원소를 제거 | ||
|
||
[shortcuts] | ||
|
||
## Problem 2: | ||
|
||
|
||
|
||
## Problem 3: | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
# 3.1 한 개로 세 개 | ||
|
||
배열 한 개로 스택 세 개를 구현 | ||
|
||
------ | ||
|
||
### 📋 contents | ||
|
||
1. 각 stack 별로 고정된 크기를 할당하는 경우 | ||
2. Approach 2: using *two* | ||
3. main() function code | ||
4. result | ||
|
||
----- | ||
|
||
#### 📝 사전지식(prior knowledge) | ||
|
||
1. | ||
|
||
--------- | ||
|
||
## Approach 1 : 각 Stack별로 고정된 크기를 할당하는 경우 | ||
|
||
```c++ | ||
class FixedMultistack { | ||
private int numberOfStacks = 3; | ||
private int stackCapacity; | ||
private int[] values; //한 배열에 들어가는 데이터 | ||
private int[] sizes; | ||
//constructor(생성자) | ||
public FixedMultiStack(int statckSize) { | ||
stackCapacity = stackSize;//스택의 용량을 스택의 크기로 설정 | ||
//배열 values의 크기를 stackSize * numberOfStacks만큼으로 지정 | ||
values = new int[stackSize * numberOfStacks]; | ||
//배열 sizes의 크기를 3으로 지정 | ||
sizes = new int[numberOfStacks]; | ||
} | ||
/* | ||
*스택에 값을 추가하는 함수 | ||
* @param stackNum [스택의 개수 : 어느 스택에 값을 넣을 것인지] | ||
* @param value [데이터 : 스택에 들어갈 데이터 값] | ||
* throw FullStackException : 스택이 가득 찬 경우 예외처리 | ||
*/ | ||
public void push(int stackNum, int value) throws FullStackException { | ||
if(isFull(stackNum)) {//만약 해당 스택이 가득 찼다면 | ||
throw new FullStackException(); //throw exception | ||
} | ||
sizes[stackNum]++; //해당 스택에 들어있는 값의 개수를 1 증가시킨다. | ||
values[indexOfTop(stackNum)] = value; //해당 스택에 값을 집어넣는다. | ||
} | ||
/* | ||
* 스택에서 값을 꺼내는 함수 | ||
* @param stackNum [어떤 스택에서 값을 꺼낼지] | ||
*/ | ||
public int pop(int stackNum) { | ||
//값 꺼내야 되는데 스택에 값이 없으면 예외처리 해준다. | ||
if(isEmpty(stackNum)) throw new EmptyStackException(); | ||
//해당 인덱스의 가장 위에 있는 원소의 인덱스를 topIndex에 저장한다. | ||
int topIndex = indexOfTop(stackNum); | ||
//값은 value에 저장한다. | ||
int value = values[topIndex]; | ||
//스택에서의 values 값은 0으로 설정하고 | ||
values[topIndex] =0; | ||
//해당 스택의 크기를 1 감소시킨다. | ||
sizes[stackNum]--; | ||
return value; | ||
} | ||
/* 가장 위에 있는 원소를 반환하는 함수 | ||
* @param stackNum [스택 번호] | ||
*/ | ||
public int peek(int stackNum) { | ||
//스택이 비워있으면 예외 처리 해준다. | ||
if(isEmpty(stackNum)) throw new EmptyStackException(); | ||
//해당 스택의 top 인덱스에서의 값을 반환한다. | ||
return values[indexOfTop(stackNum)]; | ||
} | ||
/* 스택이 비어있는지 확인하는 함수. 비었을 경우 true반환 | ||
* @param stackNum [스택 번호] | ||
*/ | ||
public bool isEmpty(int stackNum) { | ||
return sizes[stackNum] == 0; | ||
} | ||
/* 스택이 꽉 찼는지 확인하는 함수. 크기와 용량이 일치하면 꽉 찬 상태. | ||
* @param stackNum [스택 번호] | ||
*/ | ||
public bool isFull(int stackNum) { | ||
return sizes[stackNum] == stackCapacity; | ||
} | ||
private int indexOfTop(int stackNum) { | ||
int offset = stackNum * stackCapacity; | ||
int size = sizes[stackNum]; | ||
ret | ||
} | ||
} | ||
``` | ||
` ` : | ||
## Approach 2 : | ||
```c++ | ||
``` | ||
|
||
## main() function code | ||
|
||
```c++ | ||
<Title> | ||
|
||
``` | ||
|
||
## result | ||
|
||
``` | ||
``` | ||
|
102 changes: 102 additions & 0 deletions
102
CrackingtheCodingInterview/3.StackandQueue/3.1한 개로 세 개.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
# 3.1 한 개로 세 개 | ||
|
||
배열 한 개로 스택 세 개를 구현 | ||
|
||
------ | ||
|
||
### 📋 contents | ||
|
||
1. Approach 1: 각 stack 별로 고정된 크기를 할당하는 경우 | ||
2. (보류) Approach 2: 각 stack 별로 할당되는 공간 크기가 유연하게 변하는 경우 | ||
|
||
----- | ||
|
||
#### 📝 사전지식(prior knowledge) | ||
|
||
*null* | ||
|
||
--------- | ||
|
||
## Approach 1 : 각 Stack별로 고정된 크기를 할당하는 경우 | ||
|
||
```c++ | ||
class FixedMultistack { | ||
private int numberOfStacks = 3; | ||
private int stackCapacity; | ||
private int[] values; //한 배열에 들어가는 데이터 | ||
private int[] sizes; | ||
//constructor(생성자) | ||
public FixedMultiStack(int statckSize) { | ||
stackCapacity = stackSize;//스택의 용량을 스택의 크기로 설정 | ||
//배열 values의 크기를 stackSize * numberOfStacks만큼으로 지정 | ||
values = new int[stackSize * numberOfStacks]; | ||
//배열 sizes의 크기를 3으로 지정 | ||
sizes = new int[numberOfStacks]; | ||
} | ||
/* | ||
*스택에 값을 추가하는 함수 | ||
* @param stackNum [스택의 개수 : 어느 스택에 값을 넣을 것인지] | ||
* @param value [데이터 : 스택에 들어갈 데이터 값] | ||
* throw FullStackException : 스택이 가득 찬 경우 예외처리 | ||
*/ | ||
public void push(int stackNum, int value) throws FullStackException { | ||
if(isFull(stackNum)) {//만약 해당 스택이 가득 찼다면 | ||
throw new FullStackException(); //throw exception | ||
} | ||
sizes[stackNum]++; //해당 스택에 들어있는 값의 개수를 1 증가시킨다. | ||
values[indexOfTop(stackNum)] = value; //해당 스택에 값을 집어넣는다. | ||
} | ||
/* | ||
* 스택에서 값을 꺼내는 함수 | ||
* @param stackNum [어떤 스택에서 값을 꺼낼지] | ||
*/ | ||
public int pop(int stackNum) { | ||
//값 꺼내야 되는데 스택에 값이 없으면 예외처리 해준다. | ||
if(isEmpty(stackNum)) throw new EmptyStackException(); | ||
//해당 인덱스의 가장 위에 있는 원소의 인덱스를 topIndex에 저장한다. | ||
int topIndex = indexOfTop(stackNum); | ||
//값은 value에 저장한다. | ||
int value = values[topIndex]; | ||
//스택에서의 values 값은 0으로 설정하고 | ||
values[topIndex] =0; | ||
//해당 스택의 크기를 1 감소시킨다. | ||
sizes[stackNum]--; | ||
return value; | ||
} | ||
/* 가장 위에 있는 원소를 반환하는 함수 | ||
* @param stackNum [스택 번호] | ||
*/ | ||
public int peek(int stackNum) { | ||
//스택이 비워있으면 예외 처리 해준다. | ||
if(isEmpty(stackNum)) throw new EmptyStackException(); | ||
//해당 스택의 top 인덱스에서의 값을 반환한다. | ||
return values[indexOfTop(stackNum)]; | ||
} | ||
/* 스택이 비어있는지 확인하는 함수. 비었을 경우 true반환 | ||
* @param stackNum [스택 번호] | ||
*/ | ||
public bool isEmpty(int stackNum) { | ||
return sizes[stackNum] == 0; | ||
} | ||
/* 스택이 꽉 찼는지 확인하는 함수. 크기와 용량이 일치하면 꽉 찬 상태. | ||
* @param stackNum [스택 번호] | ||
*/ | ||
public bool isFull(int stackNum) { | ||
return sizes[stackNum] == stackCapacity; | ||
} | ||
/* 가장 위에 있는 원소 반환하는 함수. | ||
* @param stackNum [스택 번호] | ||
*/ | ||
private int indexOfTop(int stackNum) { | ||
int offset = stackNum * stackCapacity; | ||
int size = sizes[stackNum]; | ||
return offset + size - 1; | ||
} | ||
} | ||
``` | ||
------------------- | ||
## (보류) Approach 2 : 각 stack 별로 할당되는 공간 크기가 유연하게 변하는 경우 | ||
한 스택이 최초에 설정한 용량 이상으로 커지면, 가능한 만큼 용량을 늘려주고 필요에 따라 원소들을 이동시킨다. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
# 18. 선형 자료 구조 | ||
|
||
## 18.5-6 조세푸스 문제 | ||
|
||
#### 문제 | ||
N명의 동료병사들이 원형으로 둘러앉음. 로마에 항복하느니 차라리 자결하겠다는 결론이 나버림. | ||
한 사람이 자살하면 그 사람으로부터 시계방향으로 K번째 있는 병사가 자살함. | ||
근데 조세푸스와 한 명이 마지막에 남았을 때, 둘은 자결하지 않기로 함. | ||
2명 중 한 사람이 되려면 첫 타자로부터 몇 번째 떨어져있었어야 하나. | ||
|
||
---------- | ||
|
||
#### 풀이 | ||
|
||
```c++ | ||
#include <iostream> | ||
#include <list> | ||
using namespace std; | ||
|
||
void josephus(int n, int k) { | ||
list<int> survivors; //생존자를 저장하는 리스트 만듦 | ||
for(int i=1; i<=n; ++i) { //1번째부터 n번째 병사를 | ||
survivors.push_back(i); //생존자 리스트에 추가해준다. | ||
} | ||
//죽어야 하는 병사(oh It's so sad)를 가리키는 포인터를 생성하고, 생존자 중 첫번째 병사로 초기설정 | ||
list<int>::iterator kill = survivors.begin(); | ||
while(n>2) {//남은 생존자가 2명이 되기 전까지 | ||
kill = survivors.erase(kill); //kill이 가리키는 병사를 생존자리스트에서 삭제 | ||
if(kill == survivors.end()) { //만약 kill이 마지막 병사를 가리킨다면 | ||
kill = survivors.begin(); //원형리스트이므로 첫번째 병사를 가리키도록 설정 | ||
} | ||
--n; //생존자 수 -1 | ||
for(int i=0; i<k-1; i++) {//죽은 병사로부터 k번째 병사를 가리키도록 | ||
++kill; //kill을 k번 옮기고 | ||
if(kill == survivors.end()){//kill이 마지막 병사 가리키면 | ||
kill = survivors.begin();//원형리스트이므로 첫번째 병사 가리키도록 설정 | ||
} | ||
} | ||
} | ||
cout<<survivors.front()<<" "<<survivors.back()<<endl; | ||
//생존자가 첫번째 병사와 떨어져있던 자리를 출력 | ||
} | ||
|
||
int main() { | ||
int n = 5; | ||
int k = 2; | ||
josephus(n,k); | ||
return 0; | ||
} | ||
``` | ||
------ | ||
#### 예제설명 | ||
총 병사의 수가 5명이고, k가 2라면 초기에는 병사 `1` , `2`, `3`, `4` ,`5` 가 원형으로 삥 둘러앉아있는 상태일 것이다. | ||
즉 생존자 리스트 `survivors`에는 {1, 2, 3, 4, 5}가 저장되어 있고, 죽어야 하는 병사를 가리키는 포인터 `kill`은 survivors의 가장 첫 원소인 병사 1을 가리키고 있을 것이다. | ||
이 초기상태에서 반복문(while)을 통해 어떻게 답이 도출되는지 알아보자. | ||
| n | survivors | kill(A) | kill(B) |kill(C)| | ||
|:--:|:--:|:--:|:--:|:--:| | ||
|5(초기상태)|`1`, `2`, `3`, `4`, `5`|||| | ||
|4|`2`, `3`, `4`, `5`|1|1|3| | ||
|3|`2`, `4`, `5`|3|3|5| | ||
|2||||| |
Oops, something went wrong.