priority_queue<자료형, 구현체(container), 비교 연산자(compare 함수)> 

구현하기전 필수사항

#include <algorithm>
#include <queue>
#include <functional>

최소 힙 (= queue에 가장 top이 가장 작은 값으로 올라 오는 경우)

	priority_queue<int, vector<int>, greater<int>> min_pq; //오름차순
	min_pq.push(3);
	min_pq.push(4);
	min_pq.push(5);
	min_pq.push(6); //3,4,5,6

 

최대 힙 (= queue에 가장 top이 가장 큰 값으로 올라는 오는 경우)

	priority_queue<int, vector<int>, less<int >> max_pq;// 내림차순
	max_pq.push(1);
	max_pq.push(10);
	max_pq.push(100);
	max_pq.push(33); //100,33,10,1

 

프레임워크

현재 가장 주목 받고 있는 프레임워크는 리액트(React), 앵귤러(angular), 뷰JS(vue.js)이며 리액트는 가장 많이 사용하며, 앵귤러는 화면 출력, 형상 관리부터 배포까지 많은 기능을 포함한 완성형 프레임워크이다. vue.js는 가장 나중에 나온 프레임워크이며 다른 프레임워크의 장점은 흡수, 단점은 보완한 프레임워크이다.

 

리액트

  • 리액트는 페이스북을 개발할 때 사용한 기술이며, 공개 SW이다.
  • 리액트의 가장 큰 특징은 '화면 출력에 특화된 프레임워크'라는 것이다.
  • 리액트는 컴포넌트(Component)라는 작고 독립적인 코드 블록을 조합하여 빠르고 효율적으로 화면을 구성합니다.
    • 컴포넌트는 '레고블럭' 이라고 쉽게 이해가능하다.
  • 화면 출력 속도가 빠릅니다.
    • 기존의 자바스크립트에서 화면을 구현하는 제이쿼리나 핸들바 같은 경우는 한 부분을 수정하면 전체가 수정되어 화면의 구현속도가 현저히 느려집니다.
    • 그에반해 리액트는 '게임 엔진 원리'를 도입하여 다음에 나타날 필요할 화면을 미리 구현해뒀습니다. 따라서 다음에 나타날 화면의 일부(노드)를 미리 그려놓고 변경된 화면의 일부(노드)만 수정하는 가상화면(Virtual Dom)기술을 만들었습니다. 

노드 패키지 매니저(npm)

  • 자바스크립트 라이브러리는 노드 패키지 매니저라느 프로그램으로 관리합니다. 
  • npm은 https://www.npmjs.com에서 서 필요한 라이브러리를 내려받아 설치하고 삭제하는 등의 관리를 해주는 프로그램
  • npm은 실제로 node_modules 폴더에 라이브러리를 내려 받아 저장하고 package.json이라는 파일에 설치된 라이브러리의 정보를 적어 저장합니다. 
    • 실제 라이브러리와 라이브러리 명세 파일을 따로 관리하는 것
    • 라이브러리 명세 파일을 따로 관리하는 이유는 node_modules에 저장되는 라이브러리의 용량이 굉장히 크기 때문이다. (경우에 따라 1GB를 넘기도 한다) 
    • A개발자가 B개발자에게 프로젝트를 공유할 때 용량이 큰 라이브러리까지 전송할 필요 없이 라이브러리 명세와 핵심코드만 전다랗면 됩니다. 그러면 개발자 B는 package.json의 모록을 이용하여 손쉽게 라이브러리를 내려받을 수 있습니다.
  • yarn : npm의 단점을 보완하여 성능과 속도를 개선한 라이브러리 관리 도구

웹팩(WebPack)

  • 웹팩은 프로젝트에 사용된 파일을 분석하여 기존 웹 문서 파일로 변환하는 도구
  • 중간에 파일을 해석하는 역할 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Redux : React Native를 개발하는데 좋은 아키텍쳐 패턴

 

Reactive 

  • 리엑티브 (Reactive eXtension) = RX)
  • MicroSoft가 창안한 개념으로 데이터의 흐름에 따른 변화를만드는 비동기적 프로그래밍 패러다임.
  • 기본 실행 모델이 데이터의 흐름들 통해 자동으로 전파하는 것
  • RX패러다임은 다양한 개발언어로 확장됨
    • RxAndroid, RxJava, ReactiveCocoa, React Native...
  • Reactive -> (facebook) ->React, Flux design petten
  • React -> React native
  • Flux design petten -> Redux design petten
더보기
  •  RxAndroid : 사운드클라우드(SoundCloud)의 마티아스 캐플러스와 안드로이드 씬의 영웅 스퀘어의 제이크 와튼(Jake Wharton) 중심으로 만들어진..
  •  RxJava : 넷플릭스가 주축이 되어 자바에 포팅한..
  •  ReactiveCocoa : 깃헙(GitHub)과 페이스북(Facebook) 엔지니어들이 중심이 되어 이끌어 나가고 있다고 하나요..* React : 사용자 인터페이스를 만들기 위한 자바스크립트 라이브러리 이죠~. 페이스북과 인스타그램 소속 개발자들이 만들고 있으며, 2013년 처음 공개됬죠...
  •  React Native (리엑트 네이티브)는 리액트의 접근 방법을 모바일로 확장하는 페이스북의 오픈소스 프로젝트 입니다...그 외.....

 

Flux

 

'React' 카테고리의 다른 글

[모바일] 네이티브APP / 모바일WEB+APP / 하이브리드앱  (0) 2020.11.28

www.acmicpc.net/problem/2110

 

  • dfs 조합으로 풀었는데 실패가 뜸...
  • 집의 좌표가 엄청 길다... 이분탐색으로 풀어야함. !!!!!!

  • 간격 표

    • low는 간격 1, high는 간격 9 (사실상 최대 간격은 9-1=8이다.)
    • mid는 간격 조절 ex) mid =5 이면 cnt가 2다 (집간의 간격을 5로 두면 공유기를 설치 할 수 있는 갯수는 2개다.)
      • mid 간격 조절을 다시한다.(1) 간격이 너무 커서 공유기 설치 갯수가 2개 밖에 안나오니깐 간격을 줄인다.
        • right = mid -1;
      • mid 간격 조절을 다시한다.(2) 반대로 간격이 너무 좁아서 갯수가 3을 초과한다.
        • left = mid + 1;
low 1 1 3 4
high 9 4 4 4
mid 5 (간격이 5 이상이면 cnt++해준다) 2 3 end
cnt 2 3 3 end
answer X 2 3 3
  • 공유기가 설치된 집의 간격 >= mid 이상일 경우 cnt++ 해준다
    • cnt++이 공유기의 최소갯수보다 크면 답이 될 후보이다.
  • C++ 코드
    • 왜 Left가 1부터 시작인지는 모르겠음.. house[0]은 실패뜸...
#include <iostream>

#include <algorithm>

/*
5 3
1
2
8
4
9
*/
using namespace std;
int n, m;
int house[200000];
bool solution(int mid)
{
	int cnt = 1;
	int now = house[0];
	//cout << "mid:" << mid << endl;
	for (int i = 1; i < n; i++)
	{
		if (house[i] - now >= mid)
		{
			cnt++;
			now = house[i];
			//cout << "mid:" << mid << endl;
			//cout <<"now:" <<now << endl;
		}
		//cout << "cnt:" << cnt << endl;

	}
	if (cnt >= m)
		return true;
	return false;
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		cin >> house[i];
	}
	sort(house, house + n);
	//for (int i = 0; i < n; i++)
	//	cout << house[i] << " ";
	//int Left = house[0];
	int Left = house[0];
	int mid;
	int right = house[n - 1] - house[0];

	int result = 0;
	//cout <<"right : " <<right << endl;
	while (Left <= right)
	{
		//cout << "Left : " << Left << endl;
		//cout << "right : " << right << endl;
		mid = (Left + right) / 2;

		if (solution(mid))
		{
			result = max(result, mid);
			Left = mid + 1;
		}
		else
		{
			right = mid - 1;
		}

	}

	cout << result << endl;


	return 0;
}

SOL)

다익스트라 알고리즘 조건

  • 모든 간선의 가중치가 양수
  • 간선+ 가중치

 

 

 

dist배열 ( - : 2147000000) 무한대

 

방문 1 2 3 4 5 6
1 0 12 4 - - -
3 0 12 4 9 - -
4 0 11 4 9 14 -
2 0 11 4 9 14 -
             
             

pq

(3,4) (4,9) (2,11) (5,14)      

 

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>


/*
6 9
1 2 12
1 3 4
2 1 2
2 3 5
2 5 5 
3 4 5
4 2 2
4 5 5 
6 4 5
*/
using namespace std;
struct Edge {
	int vex;
	int dis;
	Edge(int a, int b)
	{
		vex = a;
		dis = b;
	}
	bool operator<(const Edge &b) const
	{//최소힙 가장 작은 값이 상위에 있게함.
		return dis > b.dis;
	}
};
 

int main()
{ 
	priority_queue<Edge> Q;
	vector<pair<int, int>> graph[30];
	int i, n, m, a, b, c;
	cin >> n >> m;
	vector<int> dist(n + 1, 21470000);

	for (i = 1; i <= m; i++)
	{
		cin >> a >> b >> c;
		graph[a].push_back({ b,c });
	}
	Q.push(Edge(1, 0));
	dist[1] = 0;
	while (!Q.empty())
	{
		int now = Q.top().vex;
		int cost = Q.top().dis;
		Q.pop();
		if (cost > dist[now]) continue;
		for (i = 0; i < graph[now].size(); i++)
		{
			int next = graph[now][i].first;
			int nextdis = cost + graph[now][i].second;
			if (dist[next] > nextdis)
			{
				dist[next] = nextdis;
				Q.push(Edge(next, nextdis));
			}
		}


	}//end while

	for (i = 2; i <= n; i++)
	{
		if (dist[i] < 100000)
			cout << i << " : " << dist[i] << endl;
		else
			cout << i << " : " << "IMPOSSIBLE" << endl;

	}


	return 0;
} 

'Algorithm > Algorithm_Lecture' 카테고리의 다른 글

[강의] 위상정렬  (0) 2020.09.16
  • char 배열이름[크기] ="문자열";
#include <stdio.h>

int main()
{
    char s1[10] = "Hello";  // 크기가 10인 char형 배열을 선언하고 문자열 할당

    printf("%s\n", s1);     // Hello: %s로 문자열 출력

    return 0;
}

  • 배열을 미리 선언해 놓고 문자열 나중에 할당 하는 방법
#include <stdio.h>

int main()
{
    char s1[10];     // 크기가 10인 char형 배열 선언
    
    s1 = "Hello";    // 이미 선언된 배열에 문자열을 할당하면 컴파일 에러 발생

    printf("%s\n", s1);    // Hello: %s로 문자열 출력

    return 0;
}

이미 선언된 배열에는 문자열을 할당 할 수 없음. 정 할당하고 싶으면 

s1[0] = 'h';

s1[1] ='e';

이런식으로 하나 하나 집어 넣어야함.

 

 

  • 배열이 크기 할당 시 
char s1[6] = "Hello";    // 크기가 6인 배열. Hello 5글자에 NULL 하나를 더해 6개의 공간이 필요함

 

char[] 와 char* 의 차이점

char str[] = "abc";

char *str = "abc";

char* 는 읽기 전용 수정 불가

//수정 불가
int main()
{
    char *str = "abc";
    str[0] = 'b';
}

//수정 가능
int main()
{
    char str[] = "abc";

    str[0] = 'b';
}

 

'C++' 카테고리의 다른 글

Visual Studio 2015 - 자주 사용하는 단축키  (0) 2020.08.19
[C++] 포인터(Pointer)  (0) 2020.07.23
[C++] 스택과 힙  (0) 2020.07.23
[C++] 메모리누수 체크  (0) 2020.07.23
[C++] char[] 와 char*의 차이  (0) 2020.07.22

1. ANCII(American Standard Code for Information Interchange,아스키)

  • ASCII는 최초의 문자열 인코딩.
  • 7bit로 구성 영어를 위한 문자, 숫자, 특수문자, 기호 등 128개 문자를 표현
  • 영어만을 위해 만들어졌고, 일본어, 중국어 등 다른 언어는 표현 불가
  • 이후 다른 언어를 지원해야 할 필요가 생겨 ANSI가 생겨남.

2. ANSI(American National Standard Institue, 안시)

  • ANSI는 8bit로 구성되어 있으며 256개의 문자를 표현 가능.
  • ANSI는 ASCII의 확장판으로 이해하면 된다.
  • ASCII에서 1bit를 더 사용한 것
  • ANSI의 앞 7bit는 ASCII와 동일, 뒤에 1bit를 이용하여 다른 언어의 문자를 표현
  • 단, 새롭게 추가 된 128개 문자로는 모든 언어 표현 불가.
    • 그래서 CodePage를 부여 각 언어별로 Code값을 주고, Code마다 다른 문자열 표를 의미 하도록 약속
      • ANSI = ANCII(7bit) + CodePage(1bit)

3. EUC-KR(Exteded Unix Code-Korea)

  • EUC-KR 은 한글 지원을 위해 유닉스 계열에서 나온 완성형 코드 조합.
  • 완성형 코드란, 완성 된 문자 하나하나마다 코드 번호를 부여한 것
  • 조합형 코드란, 한글의 자음과 모음 각각에 코드 번호를 부여한 후, 초성, 중성, 종성을 조합하여 하나의 문자를 나타내는 방식.
  • EUC-KR은 ANSI를 한국에서 확장한 것으로 외국에서는 지원불가.

4. CP949(Code Page 949)

  • CP949는 한글 지원을 위해 windows 계열에서 나온 확정 완성형 코드 조합이다.
  • EUC-KR은 2byte의 완성형 코드로 2bytes 내에서는 표현할 수 이쓴 완성된 문자의 수가 한계가 있었다.
  • EUC-KR 개선하여 확장하여 만든 코드이며 949는 한국을 의미한다. 932=일본, 936=중국

5. UTF-8(Universal Coded Character Set + Transformation Format -8-bit)

  • UTF-8은 유니코드를 위한 가변 길이 문자 인코딩(멀티바이트) 방식 중 하나로, ANSI의 단점을 보완하기 위해 만들어졌다.
  • ANSI는 다국어를 지원하기 위해 CodePage 정보를 미리 알고 있어야한다.
  • 멀티바이트 개념을 사용하여 하나의 Character Set에 거의 모든 문자를 넣었다.
  • ANSI는 고정바이트(1byte) 형태로 최대 256자 까지만 표현이 가능하나 UTF-8은 멀티바이트(1~4bytes)로 최대 1,112,064까지 표현가능
  • 첫 128자는 ASCII 코드 값으로 ANSI와 UTF-8이 동일. 그래서 영어로 사용할 경우 1bytes만 사용한다.
  • 2bytes를 사용하며, 중동지역 언어 또는 많은 유럽언어가 여기에 속한다. 한국,중국,일본 등 동아시아권 언어는 3byte 이상을 사용한다. 
  • UTF-8은 매우 일반적인 인코딩 방식이지만, 3bytes 이상의 문자를 사용할 경우에는 비효율적!
  • UTF-8 유니코드는 아스키 코드와 영문 영역에서는 100% 호환 만약, UTF-8 유니코드 문서에 한글 등이 전혀 없고 영문과 숫자로 이루어져 있다면 그 카드는 아스키코드와 동일 전 세계의 모든 언어를 하나의 파일에 쓸 수 있다

6. UTF-16(Universal Coded Character Set + Transformation Format -16-bit)

  • UTF-16은 16bit 기반으로 저장하는 UTF-8의 변형
  • 한글의 경우 UTF-8로 저장할 경우 3bytes가 필요한데, UTF-16으로 저장하면 2bytes면 되어 용량의 이점이 있음
  • 그러나 경우에 따라서는 2bytes이상을 사용할 경우가 있음
  • 엔디안 처리를 고려함에 따라 복잡성 증대나 ANSI호환이 안되는 단점

7. UTF-32 (Universal Coded Character Set + Transformation Format -32-bit)

  • UTF-32 는 모든 문자를 4bytes로 인코딩한다. 문자 변환 알고리즘이나 가변길이 인코딩 방식에 대한 고민을 하고 싶지 않을 때 사용함 
  • 매우 비효율적인 메모리 사용하므로 자주사용하지 않는다.

* UTF-8, UTF-16 모두 유니코드를 지원하기 위한 인코딩 방식이다. 이들을 이해하기 위해서는 유니코드에 대한 이해가 필요하다. 일반적으로 UTF-8과 유니코드를 동일하게 생각하는데 약간 차이가 있다.

 

8. UNICODE 

  • UNICODE는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현할 수 있도록 고안된 코드 조합.
  • 주의해야 할 것이 '인코딩'이 아니라는 것. 유니코드는 전세계 거의 모든 문자를 2bytes 숫자로 1:1 매핑 시키는 '방식'을 말하고, 유니코드를 표현하는 여러가지 '인코딩' 방식들이 존재함.
  • 유니코드를 표현하는 여러가지 '인코딩' 방식들이 존재하는 것이다.UTF-8, UTF-16등이 그 인코딩 중 하나인 것
  • 유니코드_목록을 통해 매핑 테이블을 확인 가능 (유니코드_목록, 한글_목록)
    • 여기서 '가'를 찾아보면 유니코드 값이 'AC00'인 것을 알 수 있는데 16진수 AC00은 10진수로 44,032인데 8bit로 나누기에 너무 크다. 이 값을 8bit 단위로 쪼개어 저장하는 방법이 UTF-8이다.(쪼개는 방법 여기)
    • window 비스타 이상에서는 유니코드를 utf-16으로 인코딩한다.
    • 유니코드 값을 바로 사용하지 않고 UTF-8을 이용하여 사용하다보니 UTF-8=UNICODE 라 생각하기 쉬운데 그게 아니다. 

 

stringstream string(arr[i])

vector<string> info;

0 "abcd abcd abcd abcd"
1 "abcd abcd abcd abcd"
2 "abcd abcd abcd abcd"
3 "abcd abcd abcd abcd"

다음과 같이 vector에 문자가 있고 각각의 문자들을 짤라서 배열에 담기

 

코드

for (int i = 0; i < info.size(); i++)
	{
		stringstream ss(info[i]);
		string s;
		vector<int> v;
		while (ss >> s)
		{
        	//s는 abcd로 빈칸마다 짤라준다.
        }

소문자를 대문자로 변환

  • toupper(char)
 for (i=0; i<str.size(); i++)

{

str[i]=toupper(str[i]); //소문자를 대문자로 교환.

}

 
  • tolower(char)
#include <cctype>
 
char c = 'a';
 
toupper(c);    // c를 대문자로 변경한 값을 반환
tolower(c);    // c를 소문자로 변경한 값을 반환

 

 

 

'Algorithm > Algorithm_Tip' 카테고리의 다른 글

[최소힙, 최대힙] priority_queue  (0) 2020.10.21
[Tip] 문자열 짜르기  (0) 2020.09.17
[강의] 투포인트 알고리즘  (0) 2020.09.12
[Java 입출력] StringTokenizer  (0) 2020.09.08
[JAVA 입력 TIP]  (0) 2020.09.08

+ Recent posts