1. README.md란?

프로젝트의 설명 뿐만이 아닌 사용방법, LICENSE, 설치법과 같은 설명이 필요한 부분에 대해서 기술하는 파일이다. 주로 Github Repository의 Main Page로서 작동한다.

README는 오랜 시간이 지난 레포지토리를 다시 찾아보거나, 함께 작업하는 동료들과 협업을 하거나, 다른 사용자들을 위해 해당 repository에 대한 직관적이고 간략한 설명서와 같은 것이다! 각 repository의 메인 페이지로, 나중을위해, 혹시나 나의 공간을 방문할 다른 사용자들을 위해서라도 조금은 신경써서 만들어 보자!

2. Readme 를 목적에 맞게 꾸며보자!

아래는 알고리즘 스터디를 하면서 간단하게 만들어본 Readme의 구성이다. Markdown잘 활용하면 노션 디자인처럼 매우 이쁘게 Readme를 꾸밀 수 있지만, Readme는 가독성이 높게 필요한 정보만 딱 나열하는 것이 더 좋아보였다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/42235ce2-9039-4c60-bbeb-be730e875146/Untitled.png

해당 주차에 풀었던 백준 문제번호와 상태를 나타낸 표로 깔끔하게 구성해 보았다. 알고리즘 분류에 맞게 스터디 커리큘럼이 되어있으므로 각 파트별로 번호를 매겨 나누어 두었다.

하지만 매 주차마다 문제를 풀고 링크를걸고... 여간 까다로운 일이 아니다. 역시 인간은 귀찮을 때 발전하는 것 같다. 아래에서 원하는 목적에 맞는 코드를 작성하여 Readme작성을 도와주는 프로그램을 만들어 보자.

3. Markdown 양식에 맞는 라인을 자동으로 작성해주는 코드를 만들어보자!

// Github Markdown AutoLink Code

#include <iostream>
#include <vector>

std::vector<std::pair<std::vector<int >, int> > questions;
std::vector<std::string> status = {"Ongoing", "Incomplete", "Complete"};
std::string directory_name = "week_";
std::string question_name = "day_";
int question_cnt;
int week;
int week_cnt;

void input_check()
{
	//
}

void input()
{
	week_cnt = 1;
	std::cout << "* 몇 주차 부터 등록하실 건가요?\\t\\t";
	std::cin >> week;
	std::cout << "* 몇 주치를 등록하실 건가요?   \\t\\t";
	std::cin >> week_cnt;
	std::cout << std::endl;
	questions.resize(week_cnt);
	for (int i = 0 ; i < week_cnt ; i++)
	{
		std::cout << "-----------------< week " << week + i << " >----------------\\n"; 
		std::cout << "1. 이번주에 몇 문제를 풀었나요?\\t\\t";
		std::cin >> question_cnt;
		questions[i].first.resize(question_cnt);
		std::cout << "2. 문제 번호를 입력하세요 !\\n";
		for (int j = 0 ; j < question_cnt ; j++)
		{
			std::cout << "Question " << j + 1 << " : ";
			std::cin >> questions[i].first[j];
		}
		std::cout << "3. 이주의 Status ? (Ongoing : 0 / Incomplete : 1 / Complete : 2)\\nStatus : ";	
		std::cin >> questions[i].second;
		std::cout << std::endl;
	}
}

int main()
{
	input();

	std::cout << "******************* Result ********************\\n\\n";
	for (int i =  week; i < week + week_cnt ; i++)
	{
		std::cout << "|[week_" << i  << "](/" << directory_name << i << ")|" ;
		for (size_t j = 0 ; j < questions[i - week].first.size() ; j++)
		{
			std::cout << "[" << questions[i - week].first[j] << "](/" << directory_name << i
				<< "/" << question_name << j + 1  <<".cpp) ";
		}
		std::cout << "|" << status[questions[i - week].second] << "|" << std::endl;
	}
	std::cout << std::endl;
}

위의 코드를 실행하면 아래와 같이 작동한다. 간단하게 작동 방식을 녹화해 보았다!!

ㅅ ㅈ ㅈ

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/0fa8c264-d14a-4e7c-bade-5d968a9851b8/__2021-02-13__8.08.29.mov

위에서 나온 라인을 복사해서 원하는 위치에 붙여넣기만 한다면 아래와 같이 이쁘게 링크까지 설정되어 들어간 것을 알 수 있다! 이제 우리는 git push만 하면 된다! 간단한 링크와 테이블을 활용해서 심심한 README를 예쁘게 꾸며보았다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/58a96529-15cb-4295-a54b-ff9651c1a299/Untitled.png