Skip to content

Commit

Permalink
Add 'baekjoon/' from commit '043a96f04660872e70c324555cd8285f40e78477'
Browse files Browse the repository at this point in the history
git-subtree-dir: baekjoon
git-subtree-mainline: b6268ed
git-subtree-split: 043a96f
  • Loading branch information
lumirlumir committed Oct 30, 2024
2 parents b6268ed + 043a96f commit 9d037f5
Show file tree
Hide file tree
Showing 225 changed files with 8,295 additions and 0 deletions.
2 changes: 2 additions & 0 deletions baekjoon/.clang-format
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
BasedOnStyle: Google
ColumnLimit: 0
12 changes: 12 additions & 0 deletions baekjoon/.editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 2
trim_trailing_whitespace = true

[*.{cpp, c, h}]
max_line_length = 0
32 changes: 32 additions & 0 deletions baekjoon/.github/workflows/SyntaxCheck.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: SyntaxCheck

on:
push:
branches: [main]
paths: # SyntaxCheck runs only when .c .cpp .h files are changed.
- "**.c"
- "**.cpp"
- "**.h"

pull_request:
branches: [main]
paths: # SyntaxCheck runs only when .c .cpp .h files are changed.
- "**.c"
- "**.cpp"
- "**.h"

jobs:
SyntaxCheck:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install clang-format
run: sudo apt-get install -y clang-format

- name: Check clang-format
run: clang-format -n -Werror $(find . -regex '.*\.\(c\|cpp\|h\)')
# Use 'clang-format -h' on linux for help manuals.
# '-Werror' option turns warnings into errors.
2 changes: 2 additions & 0 deletions baekjoon/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Ignore output(.exe) files
Src/**/Output
9 changes: 9 additions & 0 deletions baekjoon/.vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
// Editor: VScode
"editor.formatOnPaste": true,
"editor.formatOnType": true,
"editor.formatOnSave": true,
// Extension: C/C++ Extension Pack (clang-format)
"C_Cpp.clang_format_fallbackStyle": "Google",
"C_Cpp.errorSquiggles": "disabled"
}
110 changes: 110 additions & 0 deletions baekjoon/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
# 1. Introduction

- 백준(Baekjoon), 프로그래머스(Programmers) 등 Problem Solving(이하 PS)을 하며 생성된 소스 코드들을 효율적으로 관리하기 위해 고안된 프레임워크입니다.
- C/C++ 언어 사용자들을 대상으로 합니다.

## 1-1. Reasons for selecting VScode

### 1-1-1. PS만을 위한 가벼운 에디터(Editor)의 필요성.

- C 계열 언어의 개발이 주로 이루어지는 Visual Studio는 통합 IDE로써 프로그램이 무겁고 복잡합니다. 이를 단순 PS만을 위해 사용하기에는 부담이 따릅니다.

### 1-1-2. 라이브러리(Library)를 제외한 의존성 관계의 불필요성.

- 일반적인 개발의 경우, 다양한 파일 및 소스코드들의 의존성 관계를 관리하며 빌드(Build)를 진행합니다. 이를 C 계열 언어에서 효율적으로 수행하기 위해서는 Visual Studio가 최적이라 할 수 있습니다.
- 하지만, PS의 경우, 각각의 소스코드들이 독립적입니다. 각각의 소스코드 내부에서 사용되는 라이브러리(Library)들에는 의존적일 수 있지만, 이외의 파일에는 의존적이지 않습니다.
- 예를 들어, Visual Studio에서 C/C++ 프로젝트를 시작하게 되면, 외부종속성 및 리소스 등을 관리하기 위한 수많은 부가 파일들이 생성됩니다. 이는 단순 PS만을 위한 환경으로는 과합니다.

## 1-2. Shortcomings of VScode

### 1-2-1. 컴파일러의 부재 및 다소 복잡한 설치 과정.

- Visual Studio와는 달리, VScode에는 C/C++ Compiler가 내장되어 있지 않습니다. Extension을 통한 확장 설치도 불가능합니다. 따라서, 운영체제에 따라 컴파일러를 개별 설치해 주거나 기존에 설치되어 있는 컴파일러를 이용해야 합니다.
- 하지만, 이 과정이 다소 복잡합니다. 일반적인 방법으로 VScode에서 컴파일러를 사용하기 위해서는 tasks.json 파일을 수정하여 컴파일 및 빌드 관련 내용들을 설정해야 합니다. 생각보다 복잡한 과정에 어려움을 겪는 사람들이 많습니다.
- 따라서, 'C/C++ Compile Run'이라는 VScode Extension을 통해 일관된 방식으로 컴파일러를 설치 및 실행할 수 있게 하였습니다. 이는 기존 방식보다 쉽고 편리합니다.

### 1-2-2. 일관된 Convention(Linter or Formatter)의 필요성.

- Visual Studio의 경우 IDE에서 자동으로 Convention을 맞춰줍니다. 하지만, VScode는 단순 에디터이기 때문에 아무런 기능이 없습니다. 'C/C++ Extension Pack'이라는 VScode Extension을 설치하면 자동적으로 'clang-format'이라는 Formatter가 함께 설치됩니다. 이는 C/C++ 언어를 위한 Linter 혹은 Formatter라 할 수 있습니다. 'clang-format'을 통해 일관된 Convention을 유지할 수 있게 하였습니다.
- 또한, 'editorconfig'를 통해 보다 전역적인 Convention을 유지할 수 있게 하였습니다.

### 1-2-3. CI/CD 과정의 필요성.

- 문법 및 Convention 오류가 있는 소스코드가 업로드된다면 문제가 될 수 있습니다. 이를 Github Workflows를 통해 자동으로 관리합니다. c, cpp, h 확장자를 가진 파일을 수정 및 추가한 후 Push 및 Pull_Request를 진행할 경우, 자동으로 문법 및 Convention을 검사한 후 CI/CD 과정을 수행합니다.

### 1-2-4. IDE와 유사한 환경 구성의 필요성.

- 결국, Visual Studio의 장점과 VScode의 장점을 합치기 위해 현재 프레임워크를 설계하였습니다. Visual Studio처럼 편리하면서 가볍고 확장 가능한 VScode 개발환경을 만드는 것이 목표입니다.

# 2. How to install

## 2-1. Prerequisite

### 2-1-1. Git

- Git을 설치해야 합니다.

### 2-1-2. VScode

- VScode를 설치해야 합니다.

### 2-1-3. VScode Extension & C/C++ Compiler

- 아래 Extesion 및 Compiler를 VScode 상에 모두 설치합니다.

1. C/C++ Extension Pack

2. C/C++ Compile Run & TDM-GCC(Compiler)

> 'C/C++ Compile Run' Extension을 설치한 후, 해당 Extension의 Manual에 따라 TDM-GCC를 설치합니다.
>
> C Compiler의 기본 경로
>
> - /usr/bin/gcc (Linux)
> - C:\TDM-GCC-64\bin\gcc.exe (Windows)
>
> C++ Compiler의 기본 경로
>
> - /usr/bin/g++ (Linux)
> - C:\TDM-GCC-64\bin\gcc.exe (Windows)
3. EditorConfig for VS Code

## 2-2. git clone

Git Bash 상에 아래 명령어를 입력합니다.

```bash
git clone https://github.com/lumirlumir/PS_Framework.git
```

# 3. File Structures

```bash
📦PS_Framework
┣ 📂.github
┃ ┗ 📂workflows
┃ ┗ 📜SyntaxCheck.yaml # Git: Github Workflows 설정 파일.
┣ 📂.vscode
┃ ┗ 📜settings.json # VScode: Editor 설정 파일.
┣ 📂Src
┃ ┗ 📂* (Baekjoon, Programmers or Etc.)
┃ ┣ 📂Blogged # 블로그에 게시된 문제 저장.
┃ ┣ 📂Solved # 다 푼 문제 저장.
┃ ┗ 📂Unsolved # 아직 풀고있는 문제 저장.
┣ 📜.clang-format # C/C++: Convention 설정 파일.
┣ 📜.editorconfig # EditorConfig: Covention 설정 파일.
┣ 📜.gitignore # Git: Gitignore 설정 파일.
┣ 📜README.md # Git: README 파일.
┗ 📜VScode.code-workspace # VScode: Workspace 설정 파일.
```

# 4. Others

## 4-1. Blog에 Repository상의 소스코드를 삽입하는 방법.

- [Emgithub](https://emgithub.com/)

# 5. Release Note

- v0.0.1: 2024.02.20
Empty file.
8 changes: 8 additions & 0 deletions baekjoon/Src/Baekjoon/Solved/1000.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#include <stdio.h>

int main(void) {
int A, B;
scanf("%d %d", &A, &B);
printf("%d", A + B);
return 0;
}
10 changes: 10 additions & 0 deletions baekjoon/Src/Baekjoon/Solved/1001.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#include <stdio.h>

int main(void) {
int A, B, result = 0;

scanf("%d %d", &A, &B);

printf("%d", A - B);
return 0;
}
57 changes: 57 additions & 0 deletions baekjoon/Src/Baekjoon/Solved/1002.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#pragma warning(disable : 4996) // visual studio scanf 오류 방지.
#include <math.h> //수학함수 사용 목적.
#include <stdio.h>
#include <stdlib.h> //abs() 함수 사용 목적.

typedef struct {
int x; // x좌표
int y; // y좌표
int r; // 반지름
} Circle;

double center_distance(Circle c1, Circle c2) {
return sqrt(pow(c1.x - c2.x, 2) + pow(c1.y - c2.y, 2));
}

int positional_relationship(Circle c1, Circle c2) {
double d = center_distance(c1, c2); // 자료형이 double임에 주의.

/* 1. 두 원이 일치할 때 */
if (c1.x == c2.x && c1.y == c2.y && c1.r == c2.r) {
return -1;
}
/* 2. 두 원이 일치하지 않을 때 */
else {
/* 2-1. 외부 = 접점 0개 */
if (c1.r + c2.r < d)
return 0;
/* 2-2. 외접 = 접점 1개 */
else if (c1.r + c2.r == d)
return 1;
/* 2-3. 두점에서 만남 = 접점 2개 */
else if (abs(c1.r - c2.r) < d && d < c1.r + c2.r)
return 2;
/* 2-4. 내접 = 접점 1개 */
else if (abs(c1.r - c2.r) == d)
return 1;
/* 2-5. 내부 = 접점 0개 */
else if (d < abs(c1.r - c2.r))
return 0;
/* 2-6. 동심원 = 접점 0개 */
else if (d == 0)
return 0;
}
}

int main(int argc, char* argv[]) {
int T;
Circle c1, c2;

scanf("%d", &T);
for (int i = 0; i < T; i++) {
scanf("%d %d %d %d %d %d", &c1.x, &c1.y, &c1.r, &c2.x, &c2.y, &c2.r);

printf("%d\n", positional_relationship(c1, c2));
}
return 0;
}
36 changes: 36 additions & 0 deletions baekjoon/Src/Baekjoon/Solved/1003[DP]_BU.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#pragma warning(disable : 4996)
#include <stdio.h>

typedef struct {
int num0_cache;
int num1_cache;
} Cache;

Cache C[41] = {{1, 0}, {0, 1}, {}};
// Cache(Memoization), C[0] C[1] 제외 멤버변수 모두 0으로 초기화.

void fibonacci(void) {
for (int i = 2; i <= 40; i++) { // 40보다 작거나 같은 자연수
C[i].num0_cache = C[i - 1].num0_cache + C[i - 2].num0_cache;
C[i].num1_cache = C[i - 1].num1_cache + C[i - 2].num1_cache;
}
}

int main(int argc, char* argv[]) {
fibonacci();

int T;
scanf("%d", &T);
for (int i = 0; i < T; i++) {
int N;
scanf("%d", &N);
printf("%d %d\n", C[N].num0_cache, C[N].num1_cache);
}

return 0;
}

/*
문제 상황에 따라 TD방식과 BU방식 중에서 어떤걸로 문제를 풀지
결정할 줄 알아야 한다.
*/
12 changes: 12 additions & 0 deletions baekjoon/Src/Baekjoon/Solved/1008.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#include <cstdio>
#include <iostream>
using namespace std;

int main(void) {
int A, B;
cin >> A >> B;

printf("%0.10lf", ((double)A / (double)B));

return 0;
}
40 changes: 40 additions & 0 deletions baekjoon/Src/Baekjoon/Solved/1009.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#pragma warning(disable : 4996) // visual studio scanf 오류 방지.
#include <stdio.h>

int table[10][4];

int power(int a, int b) {
if (b == 0)
return 1;
else
return power(a, b - 1) * a;
}

void make_table(void) {
for (int i = 0; i < 10; i++)
for (int j = 1; j <= 4; j++)
table[i][j % 4] = (int)power(i, j) % 10;
/*
math.h의 pow()를 이용하여,
table[i][j % 4] = (int)pow(i, j) % 10;
으로 구현해도 된다.
(math.h 함수는 반환형이 double이므로, int로 형변환 해준다.)
*/
}

int main(int argc, char* argv[]) {
/* 변수선언 */
int a, b, T;

/* 테이블 만들기 */
make_table();

/* 입력값 받은 후 연산 */
scanf("%d", &T);
for (int i = 0; i < T; i++) {
scanf("%d %d", &a, &b);
printf("%d\n", table[a % 10][b % 4] == 0 ? 10 : table[a % 10][b % 4]);
}

return 0;
}
Loading

0 comments on commit 9d037f5

Please sign in to comment.