오늘은 프로그래머스 해쉬문제를 풀면서 하나 알게된 사실이 있습니다..

 

 

c++ algorithm 라이브러리 sort()를 이용할 경우

 

 

문자열은 사전 순으로 정렬이 된 결과가 나옵니다.

 

 

 

unordered_map의 경우 잘 안써와서 미숙한데, 그래도 알아두어야 겠다 생각하여 따로 작성해서 

 

 

게시글로 올려야 겠네요....! 

 

 

'학부생 공부 > C++' 카테고리의 다른 글

(21.05.22) c++ string  (0) 2021.05.23
(21.05.20) next_permutation  (0) 2021.05.20
C++ memory [heap]  (0) 2020.12.24
C++ memory [stack]  (0) 2020.12.22
값이 [a,b]인 데이터의 개수를 반환하는 함수  (0) 2020.10.10

 

오늘은 완전탐색 문제를 풀다가 사용한 c++의 next_permutation 입니다.

 

사실 알고리즘 동아리를 할 때, 한번 설명을 들은 적이 있어 알고는 있었는데 대부분의 문제풀이 때 그냥 DFS 완탐 으로 모든 경우의 수를 구해서 문제를 풀어왔었는데요.

 

오랫만에 문제를 풀어서 그럴수도 있겠지만, 익숙치 않은 IDE 에서 짜다보니 코드가 길어질수록 미세한 실수도 많이 나오고 다른 디버깅 환경에서 그 실수를 찾아내기가 생각보다 오래걸려서 next_permutation도 제대로 알아보고 익숙해져볼 생각입니다.

 

1. 조건

- next_permutation은 정렬을 조건으로 합니다.

- 물론, 원하는 출력에 따라 조건을 변경해서 출력하면 됩니다.

- 기본적인 5개의 후보로 부터 모든 가능한 5개 사이즈의 조합을 구하는 경우,

   이 후보들은 모두 오름차순 정렬이 되어 있어야 합니다. ( ex - 1 2 3 4 5 )

 

1-1. 

 - 특수한 상황이지만 기존 배열(벡터)의 상태가 { 7, 5, 1, 2, 3 }일 경우,

   7과 5는 앞에 고정된 상태로 1,2,3 만 변경됩니다.

 

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	vector<int> arr_1{ 1,5,5,7 };

	do {
		for (int i = 0; i < arr_1.size(); i++) {
			cout << arr_1[i] << " ";
		}
		cout << "\n";
	} while (next_permutation(arr_1.begin(), arr_1.end()));
	cout << "\n";

	return 0;
}

 

 

 

** 잘못된 내용이 있으면 알려주세요 **

'학부생 공부 > C++' 카테고리의 다른 글

(21.05.22) c++ string  (0) 2021.05.23
(21.05.21) string sort, unordered_map  (0) 2021.05.21
C++ memory [heap]  (0) 2020.12.24
C++ memory [stack]  (0) 2020.12.22
값이 [a,b]인 데이터의 개수를 반환하는 함수  (0) 2020.10.10

0. 프로그램이란?

 - "실행할 수 있는 파일 ( 무언가 작업하기 위해 ) "

 - ex) 윈도우의 exe 파일 

 

1. 프로세스 란?

 - " 실행되고 있는 컴퓨터 프로그램 (독립적) "

 - 각 프로세스는 각각의 자원을 할당 받는다.

 - 프로세스 간의 통신 위해서는 파이프, 소켓등을 사용해 통신한다. (비용이 상대적으로 많이 든다.)

 - Register, Counter, Stack, Heap, Code 으로 구성된다

 - 시작, 종료, 컨텍스트 스위칭 시 비용(시간) 이 많이 소요된다.

 - 프로세스 간의 전환에는 운영체제 호출을 필요로한다.

 

1-1. 프로세스 제어 블록(PCB) 란?

- 운영체제의 자료구조

- 프로세스에 정보를 저장하고 있다.

- 운영체제는 프로세스 생성과 함께 PCB를 생성한다.

- 프로세스 스위치가 발생하면 진행중이던 작업들은 PCB에 저장하고 CPU를 반환한다.

- 다시 CPU를 할당받으면 PCB에서 복원해와 종료시점부터 다시 작업을 수행한다.

- 프로세스 ID, 프로세스 상태, 프로그램 카운트(다음 실행 명령어의 주소), CPU레지스터 등이 저장된다.

 

 

2. 쓰레드 란?

 - " 프로세스의 하나의 실행 단위 "

 - 프로세스 안에서 각각의 작업을 처리한다.

 - 프로세스 안에서 동시성(concurrency)을 가지고 진행한다.

 - 한 프로세스 안의 여러개의 프로세스들은 Code, Data, Heap은 공유하고, 각각의 Stack을 가진다. 

 - 시작, 종료, 컨텍스트 스위칭 시 비용(시간) 이 적게 소요된다.

 - 쓰레드 간의 전환에는 운영체제를 호출할 필요가 없다.

 - 자원을 공유하는 만큼, 공유자원에 접근하고, 변경을 할 때 주의가 필요하다.

 

 

2-2. 멀티스레딩 이란?

- 하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 성능을 향상시키는 기법

- 각각의 스레드는 각각의 스택과 PC레지스터 값을 가진다.

- 독립적 실행흐름을 위해서 스택은 필요하다. (각각 가지는 이유)

- 스레드는 하나의 실행 단위 이므로 PC레지스터를 통해 실행위치를 CPU할당에 따라 저장,복구하여 그 위치에서 다시 실행한다.

'학부생 공부 > 운영체제(os)' 카테고리의 다른 글

스케줄러(scheduler) 종류  (0) 2021.09.20
멀티 프로세스 VS 멀티 스레드  (0) 2021.09.19
Context Switching ( 문맥 교환 )  (0) 2021.05.27

Python-shell 이용하여, Nodejs에서 파이썬 스크립트 실행시키기

 

최근노드js를 이용하여 어플을 제작 중에 있습니다.

 

만들고자 하는 기능 중 시간에 민감한 기능이 있는데, 파이썬의 api를 이용해서 구현한 것을

 

nodejs에서 실행시키고, 결과를 받아와야 할 일이 있어서, 찾아보고 진행하였습니다.

 

찾아본 결과, child-process 이용, python-shell 이용 등의 방법들이 있었는데, 비교적 간단한 파이썬 스크립트를

 

실행하는 작업이였기 때문에 저는 python-shell 을 이용하여 진행하였습니다.

 

매우 간단한 작업 같으나, 다른 블로그의 게시글 중 오래된 글들도 있어, 오류가 좀 났었습니다.

 

버전에 따른 차이도 조금 있을거라 생각하는데, 실행시킨 코드는 다음과 같습니다.

( 우분투 버전 18.04 에서 진행하였고, python-shell, 파이썬 설치 및 추가로 사용할 모듈들은 설치를 따로 해주셔야 

원하는 결과를 받으실 수 있을겁니다....!)

 

 도 설치해야 했던 것으로 기억하고, 제 코드에는 시간을 측정하는 코드가 추가로 들어가있습니다.

 

현재 상황에서는 파이썬 스크립트로 전달할 값이 없었으므로, 추석처리 했으나 포함시켜 실행도 가능합니다.

 

파이썬에서는 sys.argv 와 같은식으로 값을 사용가능합니다.

 

저는 index.js ( app.js 인 분들도 많으시겠죠 )

 

와 같은 폴더내에 파이썬 스크립트를 넣어놓았으므로 scriptPath: 는 따로 설정하지 않았습니다.

 

결과는 파이썬에서 print한 결과를 받아옵니다.

'Web & App > Nodejs' 카테고리의 다른 글

(21.05.26) connection.release() 꼭  (0) 2021.05.27
(21.05.23) async-await 에러 핸들링  (0) 2021.05.24

0. 용어 정리

    릴레이션(Relation) : 행과 열로 구성된 테이블 (물리적 데이터 저장소 구조)

    속성(Attribute) : 열(Column) , 세로 값

    튜플(Tuple) : 행(Row) , 가로값

    차수 : 속성의 수, 즉 Column의 수 

    인스턴스 : 정의된 스키마에 따라 저장된 실제 데이터 집합

    스키마 : 릴레이션의 구성, 정보 등 기본적인 구조를 정의한 것 (논리적 데이터 구조)

    도메인 : 속성의 가질 수 있는 값의 집합 ( varchar(45), char(1), INT ..... )

    카디날리티(Cardinality) : 튜플의 수

    차수 (Degree) : 속성의 수

 

1. 관계형 데이터 베이스의 일반적인 형태

      1.0 관계형 데이터 모델이란?

           - 서로 관련된 데이터 포인트에 대한 접근 및 저장을 제공하는 데이터베이스 유형 

           - 그 형태가 간단하고 직관적이다.

           - 키 (key) 라는 고유의 ID가 포함된다.      

           - SQL이 부각되면서 더욱 널리 사용되게 되었다.

           - 컴퓨터에선 SQL을 이용하여 릴레이션을 생성 및 관리, 제약조건 선언, 연산 등을 수행한다.

 

      1.1 스키마 (예시)

       

      1.2 관계형 데이터베이스 릴레이션

         (위의 스키마를 이용하여 만든 릴레이션은 아님! )

       1.3 기본적인 특징

          - 중복된 튜플은 허용하지 않는다.

          - 하나의 속성의 값들은 모두 같은 도메인 값을 가진다.

          - 각 속성의 이름은 고유하다 (중복 x)

          - 순서는 상관 없다 (튜플, 속성)

          - 속성은 단일값이여야 한다. ( ex. 위의 릴레이션에서 이름에 박진성,박수진 을 동시에 넣을 수 없다)

 

 

2. 관계형 데이터베이스의 키 (KEY)

  2.1 후보키 ( Candidate KEY)

    - 튜플들을 구별할 수 있는 속성 또는 속성의 집합

    - 키가 되는 속성들의 튜플 값들은 모두 달라서 튜플들을 구별할 수 있어야 한다.

    - 하나의 속성으로는 키가 될 수 없지만, 두개의 속성을 묶어서 키로 사용하는 경우도 있다.

 

   2.2 기본키 (Primary KEY)

    - 후보키 중 선택된 key 

    - 후보키의 특징을 그대로 가지며, null 값을 가지고 있으면 안된다.

    - 키값의 변동이 있어선 안된다. 

 

   2.3 외래키 (Foreign key)

    - 관계형 데이터베이스에서 서로 다른 테이블끼리의 연결을 위해 중요한 역할을 하는 key

    - 관계된 다른 테이블간의 참조관계를 나타낸다

    - NULL 값을 가질 수 있다.

 

3. 관계형 데이터베이스의 무결성 제약조건

 

   3.1 도메인 무결성 제약조건

      - 각 튜플들은 속성의 도메인에 지정된 값 ( INT, VARCHAR(45), CHAR(1) 등 ) 만을 가져야 한다.

 

   3.2 개체 무결성 제약조건

      - 기본키(primary key)를 지정하고, 이 키는 릴레이션 내에 튜플들을 구별할 수 있도록 하는 고유한 값을 가져야 하          며, NULL은 허용되지 않는다는 조건을 만족해야 한다.

 

   3.3 참조 무결성 제약조건   

      - 외래키는 참조할 수 없는 값을 가질 수 없다.

      - 외래키 값은 참조 릴레이션의 기본키 값과 동일하거나  NULL이어야 한다.

      - 외래키 제약조건이라고도 한다.

      - 자식 릴레이션의 외래키는 부모 릴레이션의 기본키와 도메인이 같아야 한다.

      - 자식 릴레이션의 값이 변경될 때, 부모 릴레이션의 제약을 받는다.

 

    3.4 키 (KEY) 무결성 제약조건

       - 한 릴레이션에는 최소한 하나의 키가 존재해야 한다.

요즘 다시 팀원들과의 프로젝트를 위해 서버를 구축하여 사용하고 있습니다.

 

AWS EC2 프리티어를 이용하여 서버를 구축해서 사용하고 있는데,

 

프리티어 이고 아이디가 아직 1년도 지나지 않았는데, 0.27 달러 정도 아주 조금씩이라도 과금이 쌓이고 있더라고요.....!

 

그래서 Billing을 들어가서 상세 내역을 보았는데, 일단 대부분이 Elastic IP (탄력적 IP허용) 에 과금이 조금씩 되고 있더라구요...!

 

탄력적 IP기능이란, AWS EC2의 경우 IP를 동적할당 함으로써 인스턴스를 중지 하고 다시 실행할 경우

 

IP주소가 바뀌게 되는데, 이럴때 인스턴스를 껐다 켜도 IP주소를 고정으로 사용하고 싶을 때 사용하는 기능입니다.

 

프리티어는 한달에 750시간까지 무료인 것으로 알고 있고, 인스턴스 하나만 돌릴경우 한달 내내 켜놓아도 과금이 되지 않는 시간입니다.

 

인스턴스를 여러 개 사용하거나 한다면, 과금을 조금 하거나, 인스턴스 사용량을 조절을 해주어야 겠지요....?

 

사용량을 조절하는 과정에서 탄력적IP는 꽤나 편리할 것으로 보이지만, 저는 일단 그쪽에서 과금이 조금 되길래

 

인스턴스가 아직 한개이고, 중지 시킬일도 별로 없어서 일단 탄력적 IP를 릴리스 했습니다.

 

RDS 쪽에서도 아주 조금 과금이 되던데 백업스토리지 쪽에서 빠져나가고 있네요..!

 

사실 지금까지 합쳐도 300원 수준이라... 하지만 찝찝하고 약간은 불안한 마음...ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

 

0. 시작에 앞서.

- 지금 하는 프로젝트에서도 사용하는 mysql과 같은 데이터베이스를 기본적인 이론부분부터 다시 정리해보자.

 

1. 데이터 베이스란?

- 한 조직 내에서 필요로 하는 데이터를 공동으로 사용할 수 있도록 중복을 최소화하여 통합 저장한 데이터의 집합체. 데이터를 효율적으로 처리하기 위해 개발된 것으로, 데이터의 중복에서 오는 모순성을 제거할 수 있고 새로 개발된 응용 프로그램도 데이터베이스 내에 있는 기존의 데이터를 사용할 수 있음. 자료틀. 순화어는 `기초 자료'.

( 정의 출처 : Oxford Languages )

 

2. DBMS(DataBase Management System) 란?

 

- 데이터베이스를 관리할 수 있게 해주는 소프트웨어

- 사용자와 데이터베이스 사이에서 사용자의 요구에 따라 정보를 제공해주고 데이터베이스를 관리해주는 소프트웨어

- 데이터의 종속성과 중복성 문제를 해결하기 위해 제안되었다.

- 데이터베이스의 구성, 접근방법, 유지관리에 대한 모든 책임을 진다.

- Oracle, MySQL, MSSQL 등이 있다.

 

 2-1. 데이터 종속성이란?

    - 데이터와 프로그램 사이에는 상호 의존관계가 있다.

    - 데이터에 대한 접근과 저장방법이 프로그램 안에 명세되어있다.

    - 그러므로 프로그램은 해당 데이터에 맞는 접근 방법으로 작성되어야 한다.

    - 따라서, 데이터의 속성이 변경되면, 이를 기초로 한 응용프로그램도 변경되어야 한다. 

      (반대로 프로그램의 데이터 저장방식에 따라 데이터의 저장방식이 바뀌기도 한다.)

    - 데이터 종속성 때문에 데이터의 구조가 바뀌면 프로그램도 수정해야 하므로 비용이 많이 들어간다.

    - 결국 데이터와 응용프로그램이 의존관계에 있다는 것이다.

 

2-2 데이터 중복성이란?

    - 같은 데이터를 사용하더라도, 그 사용방식에 따라 구조와 양식을 다르게 하여 사용하는 경우가 많이 존재한다.

    - 파일 시스템에서는 이러한 경우에 별도의 파일을 만들어 사용해야 한다.

    - 이러한 상황 발생시 같은 내용의 구조가 다른 데이터들이 많이 생겨나고, 하나의 시스템에서 같은 데이터가 중복되

      되게 저장 관리하는 것을 데이터 중복성이라고 한다.

    - 결국 같은 데이터가 중복된채 저장되어 있는 것이고, 이를 관리함에 있어 일부가 수정될 경우 같은 모든 중복데이터

       를 수정해주어야 한다. (그렇지 않으면 불일치성이 발생한다.)

 

3. DBMS 사용 효과

- 1. 중복성을 피해 공간 절약

- 2. 데이터의 일관성을 유지하기 편리

- 3. 데이터 무결성 유지

- 4. 데이터를 통합하여 관리가능

- 5. 보안을 유지하기에 편리하다.

- 6. 데이터베이스의 논리적 물리적 독립성을 보장

 

4. DBMS가 갖춰야할 기능

- 1. 정의 ( Definition )

    : 응용프로그램이 요구하는 데이터를 지원하기 위해 데이터베이스에 저장될 데이터의 타입과 구조, 이용방식, 제약 조

      건등을 정확히 명시하여야 하며, 데이터와 데이터 사이의 관계를 명확하게 명시해야 한다.

 

- 2. 조작 ( Manipulation )

    : 응용프로그램과 데이터베이스 사이에 인터페이스를 제공하여, 데이터 탐색, 수정, 삽입, 삭제를 할 수 있도록 한다.

 

- 3. 제어 기능 ( Control )

    : 데이터의 무결성을 유지하고, 보안에 관련된 부분을 제어해야 한다. 또한, 여러 사용자가 동시에 접근하여 수정할 때

      도 항상 정확성을 유지할 수 있도록 Concurrency control ( 동시(병행) 제어 ) 가 가능해야 한다. 

안녕하세요. 

 

반갑습니다.

 

가끔 댓글이나, 메일을 주시는 분들 중 제가 블로그를 하는 이유를 잘못 인지하고 계신 분들이 계셔서 공지란을 따로

 

마련하였습니다.

 

<블로그를 하는 이유는 다음과 같습니다.>

 

가장 큰 개인적인 이유 입니다.

 

 1. 스스로의 복습을 위함 입니다.

    - 다른 내용을 공부하다 보면, 기존의 공부했던 내용들을 까먹기 마련입니다.

 

    - 그랬을 때, 구글링을 통해서 다른 분들이 작성해놓은 글을 보고 다시 학습하는 것과 제가 스스로 그림을 만들고 작 

       성했던 글을 보는 것 과는 개인적으로는 큰 차이가 있었습니다. (스스로 쓴 글은 다시 그 내용을 습득하는데 매우 

        빠르다고 생각합니다.)

 

    - 물론 저보다 많이 아시는 분들이 작성해놓은 글을 찾아보면 더 많고, 정확하고, 깊이 있는 내용을 학습할 수 있습니

      다

 

    - 그래서 저는 까먹은 내용을 다시 학습할 때는, 제가 쓴 글을 다시 읽어서 기본내용을 학습한 뒤, 구글링을 통해서 더

       깊은 내용에 접근하는 방식으로 활용합니다.

 

 

2. 공유를 위함 입니다.

     - 저도 컴퓨터 공학과 저학년 때 부터 모르는 내용을 구글링 할 때, 해결책을 얻는 경우도 있고, 이러한 문제가 발생

        할 수 있다는 사실이 확인이 됨으로써 그것만으로도 방향성을 결정할 수 있는 경우가 많이 있었습니다.

 

     - 그래서 블로그에 글을 보면 많이 모를 때, 배운 내용을 정리해놓은 글들도 많이 있습니다.

       지금 스스로 다시 봐도 코드가 참 허접하고 저건 왜 저렇게 작성했었을까? 라고 하는 경우도 있습니다. 

        하지만 그 내용을 수정하지는 않습니다. 왜냐면 구글링을 하시는 분들은 정말 잘 아시는 고수분들도 많이 계시겠

        지만, 저와 비슷한 아직은 학습중인 사람들도 많이 있으실 것이기 때문에 그 당시의 이슈와 문제점을 같은 눈높이

        에서 공유할 수 있기 때문입니다.

 

      - 저도 도움을 받은 만큼, 타인에게 도움을 줄 수 있는 부분이 있다면 저도 공유하고 싶습니다. 그리고 그 과정에서 

        저 또한 다시 학습하고 발전할 수 있다고 생각합니다.

 

 

3. 끝을 내며....

      - 가끔 코드에 관해, "코드가 더럽다", "왜 이런식으로 짰는지" 라고 하시는 분들이 있습니다.

 

      - 저도 제가 작성했던 글을 보면 가끔 그런생각이 듭니다. 그래도 수정하지는 않습니다.

        그 당시의 제가 최선을 다해 작성한 코드이기 때문입니다. 그래서 그 당시의 저와 같은 눈높이를 가지신 분들께는

        도움이 될 수 있다고 생각합니다.

 

      - 그러한 글들을 보며 제가 지금은 어떤 부분에서 좀 더 많이 알게되었고, 아직 부족한 부분들도 알 수 있습니다.

        내용이 부족하거나, 코드가 부족하다고 안좋게 보시는 분들은 이러한 점을 조금 감안하고 봐주신다면

        감사할 것 같습니다.

 

오늘도 행복한 하루 보내시길 바래요~!!!

+ Recent posts