C++에서 map 사용법을 간단하게 알아보자


환경 및 선수조건

  • C++


맵 기본 함수

기본형태

  • map<key,value> : key와 value를 pair 형태로 선언합니다.

iterator(반복자)

  • begin() : beginning iterator를 반환
  • end() : end iterator를 반환

추가 및 삭제

  • insert( make_pair(key,value) ) : 맵에 원소를 pair 형태로 추가
  • erase(key) : 맵에서 key(키값)에 해당하는 원소 삭제
  • clear() : 맵의 원소들 모두 삭제

조회

  • find(key) : key(키값)에 해당하는 iterator를 반환
  • count(key) : key(키값)에 해당하는 원소들(value들)의 개수를 반환

기타

  • empty() : 맵이 비어있으면 true 아니면 false를 반환
  • size() : 맵 원소들의 수를 반환


구현 코드

#include <iostream>
#include <map>
#include <string>

using namespace std;

int main(){

	// map
	// <string, int> => <key, value>
	map< string, int > m;


	// insert(key,value)
	m.insert(make_pair("a", 1));
	m.insert(make_pair("b", 2));
	m.insert(make_pair("c", 3));
	m.insert(make_pair("d", 4));
	m.insert(make_pair("e", 5));
	m["f"] = 6; // also possible


	// erase(key)
	m.erase("d");
	m.erase("e");
	m.erase(m.find("f")); // also possible


	// empty(), size()
	if(!m.empty()) cout << "m size : " << m.size() << '\n';


	// find(key)
	cout << "a : " << m.find("a")->second << '\n';
	cout << "b : " << m.find("b")->second << '\n';


	// count(key)
	cout << "a count : " << m.count("a") << '\n';
	cout << "b count : " << m.count("b") << '\n';


	// begin(), end()
	cout << "traverse" << '\n';
    // map< string, int >::iterator it; also possible 
	for(auto it = m.begin(); it != m.end(); it++){
		cout << "key : " << it->first << " " << "value : " << it->second << '\n';
	}

	return 0;

}


C++의 next_permutation 함수를 이용해서 조합을 만들어보자

환경 및 선수조건


next_permutation 함수

기본 사용법

위 링크를 통해서 더 자세하게 볼 수 있지만 간단하게나마 정리하고 갑니다.

example.cpp

#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

int main (){

	vector<int> v;

	// 1부터 4까지 대입
	for(int i=0; i<4 ;i++){
		v.push_back(i+1);
	}

	// 정렬
	sort(v.begin(), v.end());

	//순열
	do{
		// 출력
		for(int i=0; i<v.size(); i++){
			printf("%d ", v[i]);
		}

		printf("\n");

	}while(next_permutation(v.begin(), v.end()));

	return 0;

}


중복이 있는 원소들의 경우

중복이 있는 원소의 경우 중복인 경우를 제외하고 순열을 만들어줍니다. 즉, 예를 들어서 0 1 1이 있다면 아래와 같은 경우만 순열을 출력해줍니다.

0 1 1
1 0 1
1 1 0

example.cpp

#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

int main (){

	vector<int> v;

	// 0 1 1 대입
	v.push_back(0);
	v.push_back(1);
	v.push_back(1);

	// 정렬
	sort(v.begin(), v.end());

	//순열
	do{
		// 출력
		for(int i=0; i<v.size(); i++){
			printf("%d ", v[i]);
		}

		printf("\n");

	}while(next_permutation(v.begin(), v.end()));

	return 0;

}


next_permutation을 이용해 조합(Combinataion) 구하기

원리

전체 n개의 원소들 중에서 k개를 뽑는 조합(=nCk)을 구한다면 n개의 벡터 원소에 1k0을 나머지인 n-k개 집어넣어서 순열을 돌리고 1에 해당하는 인덱스만 가져오면 된다.


코드

1부터 6까지의 수 중에서 4개를 뽑아서 조합을 만들어보자.

example.cpp

#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

int main (){

	// 1부터 6까지 담을 벡터
	vector<int> n;

	// 1부터 6까지 생성
	for(int i=0; i<6; i++){
		n.push_back(i+1);
	}

	// 0과1을 저장 할 벡터 생성
	vector<int> ind;

	// k=4, 4개를 뽑으니까
	int k = 4;

	// k개의 1 추가
	for(int i=0; i<k; i++){
		ind.push_back(1);
	}

	// 2개(6개-2개)의 0 추가
	for(int i=0; i<n.size()-k; i++){
		ind.push_back(0);
	}

	// 정렬
	sort(ind.begin(), ind.end());

	//순열
	do{
		// 출력
		for(int i=0; i<ind.size(); i++){
			if(ind[i] == 1){
				printf("%d ", n[i]);
			}
		}

		printf("\n");

	}while(next_permutation(ind.begin(), ind.end()));

	return 0;

}

구현 결과

3 4 5 6
2 4 5 6
2 3 5 6
...
1 2 3 6
1 2 3 5
1 2 3 4


참고자료

  • 코드플러스 알고리즘 중급 강의

How to fix “Page build warning”(about theme setting) mail from github

Environment and Prerequisite

  • Jekyll
  • YAML


Problem

Sometimes we receive mail of which title is Page build warning from github page.

...
You are attempting to use a Jekyll theme, [Your theme name], which is not supported by GitHub Pages.
...


Solutions

There are two solutions


1. Set to comment or erase theme variable in _config.yml

_config.yml

...
#theme : [Any theme name on above link]
...


2. Add proper theme variable value in _config.yml

Set theme value to one of values in https://pages.github.com/themes/

...
theme : [Any theme name on above link]
...


Reference

https://help.github.com/articles/adding-a-jekyll-theme-to-your-github-pages-site/

“Page build warning”이 나올 때 메일이 오는데 해결 방법을 알아보자

환경 및 선수조건

  • Jekyll
  • YAML


문제

다음 아래와 같이 Page build warning이라는 제목으로 메일이 올 때가 있다.

...
You are attempting to use a Jekyll theme, [Your theme name], which is not supported by GitHub Pages.
...


해결방법

2가지 해결방법이 있는데 아래와 같다.


1. _config.yml에서 theme 변수 주석 처리

공식으로 지원하는 theme가 아니면 아래 변수를 주석 처리해주거나 삭제하면 메일이 오지 않는다.

_config.yml

...
#theme : [Any theme name on above link]
...


2. _config.yml에서 theme 변수에 값 제대로 추가

https://pages.github.com/themes/에 나와있는 테마중 하나로 변수를 변경해줍니다.

_config.yml

...
theme : [Any theme name on above link]
...


참고자료

https://help.github.com/articles/adding-a-jekyll-theme-to-your-github-pages-site/

Update(2019.08.18) : Add --unpublished option example to build ‘published: false’ post for local build.

Make jekyll blog post to private(not published)

Environment and Prerequisite

  • Jekyll
  • YAML


Front Matter’s published variable

When we make jekyll post, we always make yaml front matter.

Add published variable to front matter yaml and give value to private.

  • published : true : post to public
  • published : false : post to private

---
layout : post
title : [title post]
...
published : false
...
---

This option makes not to generate specific post. So if this option exist then its post will not be shown in local or server after build. If you’d like to see this post for test in local not in server, then add below option when you build.

  • Add --unpublished option when build
  • jekyll build command could be different depends on user’s system
bundler exec jekyll serve --unpublished
# OR
jekyll serve --unpublished


Reference