Skip to content

Commit

Permalink
Add file
Browse files Browse the repository at this point in the history
  • Loading branch information
witheunjin committed Jul 19, 2020
1 parent b7a8cb4 commit c1567ed
Show file tree
Hide file tree
Showing 5 changed files with 418 additions and 0 deletions.
41 changes: 41 additions & 0 deletions CrackingtheCodingInterview/2.Linked List/unit2_LinkedList.md
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:



117 changes: 117 additions & 0 deletions CrackingtheCodingInterview/3.1.md
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 CrackingtheCodingInterview/3.StackandQueue/3.1한 개로 세 개.md
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 별로 할당되는 공간 크기가 유연하게 변하는 경우
한 스택이 최초에 설정한 용량 이상으로 커지면, 가능한 만큼 용량을 늘려주고 필요에 따라 원소들을 이동시킨다.
67 changes: 67 additions & 0 deletions JongManBook/18.선형자료구조/선형자료구조.md
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|||||
Loading

0 comments on commit c1567ed

Please sign in to comment.