STL(Standard Template Library)

템플릿으로 작성된 제네릭 클래스들과 함수들 라이브러리

->보다 쉽게 프로그래밍을 할 수 있음

 

STL의 3가지 종류

1. 컨테이너(클래스)

자료 구조 구현 클래스

컨테이너 종류 설명
vector 가변 크기 배열 일반화 클래스
list 삽입/삭제 리스트 클래스
deque 앞뒤 입력 가능한 큐 클래스
set 정렬된 순으로 값 저장 집합 클래스
map (key,value)쌍 저장 클래스
stack 스택 일반화 클래스
queue 큐 일반화 클래스

2. 반복자(컨테이너 원소 포인터)

반복자=iterator

컨테이너의 원소들에 접근하기 위한 원소에 대한 포인터

ex) iterator(다음 원소 전진), reverse_iterator(지난 원소 후진)

3. 알고리즘(함수)

템플릿 함수

컨테이너의 원소들에 대한 기능을 구현

ex) 복사, 검색, 삭제 등

 

보통 이 세 가지를 아우러서 함께 사용함

 

STL은 std 이름 공간에 저장돼있기 때문에 using namespace std; 코드가 필요하다.

 

참고

서적: 명품 C++ 프로그래밍

 

 

 

'프로그래밍 언어 > c++' 카테고리의 다른 글

[STL] 덱(Deque)  (0) 2021.10.12
[STL] 큐(Queue)  (0) 2021.10.11
[STL] vector 컨테이너  (0) 2021.09.19
C++ break 문과 continue문  (0) 2021.09.12
visual studio LINK2005 에러  (0) 2021.09.08

ios_base::sync_with_stdio(false);

c++ 컴파일러는 c와 c++ 입출력을 다 허용하는데, 이를 위해 동기화 되어있다.

위 코드는 C 표준 스트림과 C ++ 표준 스트림 간의 동기화를 비활성화

iostream과 stdio 버퍼를 모두 사용하지 않고 C++만의 독립적인 버퍼 사용

사용하는 버퍼 수 감소 -> 실행 속도 향상

cin.tie(NULL);

cin과 cout은 버퍼를 공유(tie)하고 있다.

cin에 cout이 묶여 있으면 프로그램이 사용자에게 입력을 요청하기 전에 버퍼를 확인하고 플러시과정 거침

위 코드는 cin에 cout을 untie

플러쉬 과정 사라짐 - > 실행 속도 향상

 

참고 사이트

https://jaimemin.tistory.com/1521

https://leeeegun.tistory.com/4

라이징 캠프 ?

 

두 달동안 안드로이드, ios, 서버 세션 중 하나를 이론부터 시작해

마지막엔 클라이언트-서버 협업으로 프로젝트까지 해볼 수 있는 교육 프로그램!

( 들리는 소문에 2기부터는 파트도 추가적으로 운영되고있는 것 같다. )

자세한 커리큘럼과 수업 진행 방식은 아래 사이트를 참고해주세요 : )

https://risingcamp.com/

 

Rising Camp with 컴공선배

Rising Camp에 대해 더 자세히 알고 싶다면? 여기를 눌러 링크를 확인하세요.

risingcamp.com

 

지원 동기

 

전공생이지만 라이징 캠프를 수료하기 전까지 서버 개발 경험이 전무했다. 컴공 3학년에 재학 중이었지만 학교엔 실무와 관련된 전공 수업(웹/앱 프로그래밍)이 없었고 자바 전공 수업도 없었고 커리큘럼이 느린 학과 특성상 아직 데이터베이스나 네트워크 프로그래밍, 운영체제와 같은 과목들을 수강하기 전이었다. ( 물론 컴공은 자기주도학습이 중요한 학과라고 생각한다. )

 

이런 상황에서 3학년이 되고 취업에 관심이 생길수록 프로젝트와 실무 경험에 대한 갈증이 점점 커져갔던 것 같다. 작게는 학과 내에서, 넓게는 외부 유명동아리/우테코와 같은 여러 활동들을 다 알아봤었는데 시기도 맞고 서버 관련 프로젝트 경험이 아예 없는 3학년 전공생이 갈 수 있는 곳이 많지 않았다. 단순하게 과 동기들과 프로젝트를 할 수도 있었지만 누군가 이끌어주는 사람이 존재해서 짧은 시간 안에 많은 걸 배워가고 싶었다. 이때 우연히 라이징 캠프 모집 공고를 보게 됐고 보자마자 지원해야겠다는 생각이 들었다.

 

 

2달 간의 교육을 통해 얻은 것들

 

교육을 받기 전엔 DBMS, ERD, API, SQL, AWS, 스프링 부트 등등 거의 서버에 관련된 모든 걸 몰랐다. 배웠던 것들 중에서 그나마 해본 게 자바였는데 이마저도 학교에서 깊게 배운 게 아니라 한참 전에 따로 자바 문법 기초 인강을 수강하며 코드를 따라쳐봤던 게 다였다. 교육이 끝난 지금, 서버 개발 과정의 흐름에 대한 감이 생겼으며 실제로 마지막에 진행했던 프로젝트에서 아이디어스 앱을 클론 코딩하여 클라이언트 분과 결과물을 만들어냈다. 이 결과물을 통해 우수 수료자로도 뽑힐 수 있었다.

 

 이 과정들을 통해 서버 관련 지식들(환경 구축, ERD 설계 부터 API 설계/구현, 외부 API 사용, 스프링부트 사용 등)은 물론이거니와 클라이언트와 소통하는 방법, 매주 진행했던 수업에서는 어떻게 다른 개발자분들한테 내 작업을 정리하여 설명하면 좋을지 고민해 보는 시간 등을 가질 수 있었다. 또한, 학교에서 배웠던 과목들 중에 실무와 크게 관련이 없어보였던 과목들도 결국엔 코딩을 하기위한 기초 체력이 된다는 걸  느꼈다.

 

8주 동안 좋기만 했나?

 

컴공에서 공부를 하면서 한 번도 과제를 못 냈던 적이 없었다. 그래서 솔직히 라이징 캠프를 시작할 땐 '무조건 우수 수료, 힘들어봤자 얼마나 힘들겠어'라고 생각했었는데 이게 웬걸 수료라도 되길 바랐던 순간들이 많았다.

 

아무래도 서버에 관련된 지식들이나 자바로 코드를 짜본 경험이 거의 없는 상태에서 교육을 받아서 남들보다 더 많은 노력이 필요했던 것 같다. 진도가 너무 안 나갈땐 밥 먹고 자는 시간 빼고 책상에 앉아있었고 그마저도 시간이 부족할 땐 밥을 먹으면서 코딩하거나 밤을 새울 때도 있었다. 이런 막막함을 처음 경험하게 됐을 땐 자려고 누웠다가 계속 잠이 깨길래 결국엔 다시 책상에 앉았던 적도 있었다. ( 이후 오류 해결하고 아주 푹 잤다: ) )

 

계속하다 보니 놓지만 않고 계속 붙잡고 있으면 모든 오류는 해결된다는 것을 알게 됐고 점점 오류를 직면하거나 감을 못 잡고 헤맬 때도 담대함을 가질 수 있었다. 수업 외적으로 중요하게 얻어 가는 부분들 중에 하나라고 생각하며 혹시나 나와 비슷하게 서버 관련 지식이 거의 없는 분이 라이징 캠프나 비슷한 활동들을 고려하며 이 글을 읽고 계시다면, 이 글을 읽고 걱정하시기보단 그러니까 더 부딪혀보시라고 말씀드리고 싶다! 아마 나보다 더 잘 해내실 거라고 생각한다.

 

 

내가 느낀 라이징캠프 메리트 요약

 

- 기간이 짧다 ( 대학에 재학 중인 학생들도 참여할 수 있다. )

- 단순 주입식 교육이 아니다

- 기초부터 프로젝트까지 다 경험할 수 있다

- 클라이언트와 협업을 해볼 수 있다

- 언제든 슬랙을 통해 질문을 할 수 있다 

- 서버를 거의 몰라도 참가할 수 있다

- 수료 후 다양한 혜택들이 있다( 메이커스 동아리 서류 통과, 멘토링 활동, 취업 도움, 특강 참가, 외주 등 )

- 단기간에 많은 걸 배울 수 있다

 

 

내가 느낀 라이징 캠프 디메리트 요약

 

- 기간이 짧은게 장점이자 단점이다( 당연한 말이지만 노베이스면 그만큼 시간투자를 많이 해야한다)

- 실제로 앱 런칭까지 해본 경험자라면 얻어가는 양이 다를 것 같다

break문

: 더 이상 반복하지 말고 반복문도 벗어남

continue문

: 반복문을 벗어나진말고 continue 다음 문장들은 무시하고 다음 반복을 시작

'프로그래밍 언어 > c++' 카테고리의 다른 글

[STL] 덱(Deque)  (0) 2021.10.12
[STL] 큐(Queue)  (0) 2021.10.11
[STL] vector 컨테이너  (0) 2021.09.19
STL  (0) 2021.09.19
visual studio LINK2005 에러  (0) 2021.09.08

브루트 포스(Brute Force) / 완전탐색

brute: 짐승 force:힘

->무식하게 풀기, 모든 경우의 수를 다 계산해보기

->시간면에서 매우 비효율적

->하지만 그만큼 만들기 단순함

 

주의할 점) 모든 경우의 수를 다 계산해보기 때문에 문제의 데이터값 범위를 잘 확인하여

범위를 넘지않는지 잘 확인해야 함.

 

소수: 1과 자기자신(n)만을 약수로 가지는 수

 

방법 1) 2~n-1까지 모든 수를 다 나눠보며 나눠 떨어지지 않으면 소수다.

방법 2) 메모제이션 이전까지의 모든 소수로 나눠 떨어지지 않으면 그 수는 소수다.

방법 3) 제곱근 2~루트n 사이의 수를 다 나눠보며 나눠 떨어지지 않으면 소수다.

방법 4) 에라토스테네스의 체  n^1/2 이하의 수의 배수를 다 지운후 남아있는 수가 소수다.

 

참고사이트

https://velog.io/@hyeon930/%EC%86%8C%EC%88%98%EB%A5%BC-%EA%B5%AC%ED%95%98%EB%8A%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

https://coding-factory.tistory.com/367

https://danidani-de.tistory.com/50

 

구글링을 하다가 우연히 endl을 통해 개행을 할 경우 출력과 함께 버퍼를 지워 속도가 

더 느리다는 게시글을 봤다.

endl 대신 C언어에서 사용했듯이 '\n'을 통해 개행을 진행하면 실행 속도를 향상 시킬 수 있다.

 

참고사이트 

https://jaimemin.tistory.com/1521

한 프로젝트 내 main 함수가 여러 소스들에 중복으로 있을 경우 오류가 발생한다.

->프로그램 실행 시 main 함수를 제일 처음 찾아가 코드 실행 하게 되는데 main 함수가 여러 개일 경우 오류가 발생

 

이때 main 함수를 수정할 수 없을 경우 중복되는 main 함수가 있는 소스 파일들을 무력화시키면 디버깅시 오류가 발생하지 않는다.

<특정 소스파일 디버깅에 포함되지 않도록 무력화 시키는 방법>

1.소스파일 우클릭

2.속성 클릭

3.일반-빌드에서 제외 '예'로 변경

 

참고사이트

https://komas.tistory.com/30

'프로그래밍 언어 > c++' 카테고리의 다른 글

[STL] 덱(Deque)  (0) 2021.10.12
[STL] 큐(Queue)  (0) 2021.10.11
[STL] vector 컨테이너  (0) 2021.09.19
STL  (0) 2021.09.19
C++ break 문과 continue문  (0) 2021.09.12

최대공약수: 공통된 약수 중 가장 큰 수

유클리드 호제법 이용

R이 0이 될 때까지

A % B = R

A = B

B = R 

반복하고 마지막 A가 최대 공약수가 된다.

 

최소공배수: 공배수 중에서 가장 작은 수

A*B/최대공약수 이용  (최소공배수 * 최대공약수 = A * B이기 때문에)

=>A*B/gcd(A, B)

 

참고 사이트

https://twpower.github.io/69-how-to-get-gcd-and-lcm

 

mod 연산을 사용하여 나머지 연산을 구한다.

a mod b : a b로 나눈 나머지

  • (A + B) % M = ((A%M) + (B%M)) % M
  • (A X B) % M = ((A%M) X (B%M)) % M
  • (A - B) % M = ((A % M) - (B % M) + M) % M

뺄셈 연산의 경우만 mod 연산을 수행한 값이 음수가 나올 수 있으므로 굵은 글씨 부분을 추가해야 한다.

ex) -5 mod 3 은 값이 1이 나와야 한다. (-2+3=1)

 

 

참고사이트

https://velog.io/@gidskql6671/%EB%82%98%EB%A8%B8%EC%A7%80Modulo-%EC%97%B0%EC%82%B0-%EB%B6%84%EB%B0%B0%EB%B2%95%EC%B9%99

https://codingram.tistory.com/26

https://teus.me/736

 

빅오 표기법 사용

ex) O(N)

Big O

g(n)<=c*f(n):asymptotic upper bound

(c:some positive real constant N:some nonnegative integer s.t. for all n>=N)

g(n) is big O of f(n)

시간 복잡도를 계산할 때 상수는 버리며 가장 차수가 큰 변수를 기준으로 한다.

ex) n^2 와 n이 있을 경우 n^2이 빅오 표기법에 사용됨.

 

시간복잡도와 달리 공간 복잡도는 알고리즘 문제에서 크게 상관이 없는 경우가 많지만

필요없는 공간을 사용하고 있진않은지 신경을 쓸 필요는 있다.

'cs > 알고리즘' 카테고리의 다른 글

[알고리즘] 최대공약수와 최소공배수  (0) 2021.09.08
[알고리즘] 모듈러 연산(나머지 연산)  (0) 2021.09.08
Time complexity Analysis  (0) 2021.05.09
Space Complexity Analysis  (0) 2021.05.09
Efficiency  (0) 2021.05.09

21/02/28

 

3-1 학기에 알고리즘 과목을 수강하며 본격적으로 배우기 전에 프로그래밍 대회가 어떤 식으로 진행되는지 맛보면 공부할 때 방향 잡기가 수월할 것 같아서 SUAPC 2021 Winter에 참가했다.

ICPC 대회처럼 3인1팀으로 진행되는 대회라 동기 2명을 섭외해서 참가했다.

(대회를 위해 자취방을 제공해준 동기에게 무한한 감사를ㅎㅎ)

c++로 대회에 참가하려고 하는데 2-1에 객체지향 프로그래밍을 배운 이후로 c++을 안쓴지 반 년이 넘어서

대회 일주일 전쯤부터 c++을 복기하고 알고리즘 내용을 간단하게라도 공부해서 정리했다.

그리고 종만북에서 대회 정보에 관련된 부분을 보며 어떤 식으로 대회에 접근해야되는지 공부했다.

입상은 하지못했지만 아직 시작하는 단계이기 때문에 앞으로 이 경험을 바탕으로 더 성장해 나가고 싶다.

아래는 간단하게 알고리즘들을 정리한 내용이다.

 

선택정렬 n^2

가장 작은 것을 선택해서 제일 앞으로 보내는 알고리즘

버블정렬 n^2

바로 가까이에 있는 두 숫자끼리 비교를 해서 더 작은 숫자를 앞으로 보내줌

삽입정렬 n^2

각 숫자를 필요할 때만 적잘한 위치에 삽입하는 방식

데이터가 이미 정렬됐을 경우 최적

퀵정렬 n*logn n^2

분할 정복 알고리즘

하나의 큰 문제를 두 개의 작은 문제로 분할 하는 방식

특정한 값을 기준으로 큰 숫자와 작은 숫자를 서로 교환한 뒤 배열을 반으로 가름

병합정렬 n*logn

분할 정복 알고리즘

일단 정확히 반으로 나누고 나중에 합치는 순간에 정렬을 수행

c++ STL sort함수

#include <algorithm

sort(시작점 주소, 마지막 주소+1);

기본적으로 오름차순 정렬

bool 함수를 추가하여 sort 마지막에 인자로 넣어주면 오름차순이 아닌 다른 순으로도

정렬 가능함

대회용으로는 pair함수와 같이 사용하는 것이 좋음

힙정렬

힙트리 구조를 이용하는 정렬 방식

이진트리

모든 노드의 자식 노드가 2개 이하인 트리 구조

완전이진트리

데이터가 루트노드부터 시작해서 자식 노드가 왼쪽 자식 노드, 오른쪽 자식 노드로 차근차 근 들어가는 구조

최솟값이나 최댓값을 빨리 찾아내기 위해 완전 이진 트리 기반

최대힙

부모 노드가 자식 노드보다 큰 힙

힙 생성 알고리즘

특정한 노드의 두 자식 중에서 더 큰 자식과 자신의 위치를 바꾸는 알고리즘

계수정렬

크기를 기준으로 개수를 세는 알고리즘

스택

후입 선출

택배 상하차

선입선출

은행 창구

너비우선탐색

큐 사용

탐색을 할 때 너비를 우선으로 하여 탐색을 수행

최단 길이를 보장할 때 많이 사용

깊이우선탐색

스택사용

스택의 최상단 노드를 확인한 후 방문하지 않은 인접 노드가 있으면

그 노드를 스택에 넣고 방문처리함

방문하지 않은 인접 노드가 없으면 최상단 노드를 뺌

유니온 파인드(합집합 찾기)/서로소 집합

여러 개의 노드가 존재할 때 두 개의 노드를 선택해서

현재 이 노드가 같은 그래프에 속하는지 판별

부모를 합칠 때는 일반적으로 더 작은 값 쪽으로 합침

재귀함수를 사용해서 타고타고 올라가서 같은 그래프인지 확인

크루스칼 알고리즘

가장 적은 비용으로 모든 노드를 연결

1. 비용을 기준으로 오름차순 정렬

2. 정렬된 순서에 맞게 그래프에 포함

3. 포함시키기 전에 사이클 테이블 확인

4. 사이클을 형성하는 경우 간선에 포함안함

전위 순회

자기 자신, 왼쪽 자식, 오른쪽 자식

중위 순회

왼쪽 자신, 자기 자신, 오른쪽 자식

후위 순회

왼쪽 자신, 오른쪽 자신, 자기 자신

다이나믹 프로그래밍

하나의 문제는 단 한 번만 풀도록 하는 알고리즘

메모이제이션을 활용해 이미 계산한 결과는 배열에

저장한 후 재사용

에라토스테네스의 체

가장 대표적인 소수 판별 알고리즘

소수를 대량으로 빠르고 정확하게 구하는 방법

다익스트라 알고리즘

다이나믹 프로그램 활용 최단경로 탐색 알고리즘

특정한 하나의 정점에서 다른 모든 정점으로 가는 최단 경로를 알려줌

하나의 최단 거리를 구할 때 그 이전까지 구했던 최단 거리 정보를 재사용

현재까지 알고 있던 최단 경로를 계속해서 갱신

이차원 배열 형태로 처리해야 함

플로이드 와샬 알고리즘

다이나믹 프로그래밍 활용 거쳐가는 정점을 기준으로 최단거리를 구함

위상 정렬

순서가 정해져있는 작업을 차례로 수행해야 할 때

그 순서를 결정해 주기 위해 사용하는 알고리즘

DAG(사이클이 발생하지 않는 경우)에만 적용 가능

SCC 알고리즘, 강한 결합 요소

그래프 안에서 강하게 결합된 정점 집합

같은 scc에 속하는 두 정점은 서로 도달이 가능함

사이클이 발생하는 경우 무조건 scc에 해당

타잔 알고리즘

모든 정점에 대해 dfs를 수행하여 scc를 찾는 알고리즘

네트워크 플로우

특정한 지점에서 다른 지점으로 데이터가 얼마나 많이 흐르고 있는지 측정 알고리즘

최대 유량 문제

각 간선에 정해진 용량이 있을 때 최대로 보낼 수 있는 유랑의 크기를 구하는 문제

bfs이용이 일반적

==에드몬드 카프 알고리즘

순서가 상관없으므로 음의 유량도 계산 가능함

이분 매칭

a집단이 b집단을 선택하는 방법에 대한 알고리즘

두 개의 집단이 있음

그래프 형태로 표현

kmp 알고리즘

대표적인 문자열 매칭 알고리즘

모든 경우를 다 비교하지 않아도 부분 문자열을 찾을 수 있음

접두사와 접미사가 일치하는 최대길이를 활용해 모든 경우를 다 비교하지

않고도 부분 문자열을 찾을 수 있는 알고리즘

문자열 매칭 알고리즘

특정한 글이 있을 때 그 글 안에서 하나의 문자열을 찾는 알고리즘

단순 비교 문자열 매칭 알고리즘

하나씩 일일이 확인하는 가장 간단한 형태의 알고리즘

문자열의 위치를 세트로 하나씩 밀어가며 맞을 때까지 찾는 알고리즘

라빈 카프 알고리즘

항상 빠르지는 않지만 일반적인 경우 빠르게 작동하는 간단한 구조의 문자열 매칭 알고리즘

문자열의 해시 값을 비교하여 그 일치 여부를 검사하는 알고리즘

해시 값이 일치할 경우 하나씩 비교해보며 실제로 맞는지 확인

긴 글의 해시 값을 빨리 계산하기 위해서 제일 앞에 문자의 수를 빼고

들어올 문자의 해시값을 더해도 됨

해시

긴 데이터를 그것을 상징하는 짧은 데이터로 바꾸어 주는 기법

완전 탐색

가능한 경우를 일일이 다 탐색

탐욕적 기법(그리드 알고리즘)

항상 눈앞의 가장 큰 이익만을 좇는 방법

 

 

 

'활동 > 대회' 카테고리의 다른 글

2021 홍익대학교 프로그래밍 경진대회 회고  (0) 2021.11.10

+ Recent posts