문제풀이 시 20~30분 고민했는데 답이 안나오면 과감하게 답을 봐라 (외우다시피 봐도 됨) 코드 이해하고 혼자서 다시 스스로 짜본다 체크해놓고 나중에 반드시 다시 풀어야 함 답을 보든 안보든, 저번에 풀었든 안풀었든 끝까지 풀었다는 것이 제일 중요하다. |
완전 탐색 - 시간이 없다면 오직 완전 탐색만 풀어라
- for문 사용
- 순열, 조합 사용
- 재귀함수 사용(DFS)
- 비트마스크 사용
시뮬레이션, BFS, DFS, DP가 중요함 - 어딜가든 요즘 DP 한 문제씩 나옴
- DP가 합격 기준을 가르는 결정적인 요소라는 생각은 안듭니다. 코테는 어디까지나 서류 다음에 떨구는 요소이기 때문에 기본 문제만 잘 풀면 코테 정도는 다 통과되는듯(네카라 급은 제외) ->DP는 1억 급의 매우 큰 단위로 출제됨
- 코테가 너무 쉽게 나왔다면 서류에서 미완성이 보였지만 서류합이 어거지로 된 사람을 떨구는 거 같음
그리디 알고리즘 (개인적으로 아래 문제를 풀고 느낌 잡음)
백준 1931 회의실 배정
백준 11000 강의실 배정
그래프,MST(최소신장트리), 다익스트라, 분할정복, 백트래킹, 투포인터(프로그래머스 보석 쇼핑)
프로그래머스(여기 1~2레벨은 기본으로 다 풀어야함. 3~4 풀 정도면 마스터)
백준에 있는 삼성 기출 문제집 풀기
https://www.acmicpc.net/workbook/view/1152
혹은 SWEA 모의 문제 풀기
https://www.swexpertacademy.com/
백준 DP 모음
www.acmicpc.net/workbook/view/2163
입출력속도 개선
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
C++(STL 정리)
pair : utility에 있지만, algorithm, vector같은 헤더파일에서 이미 포함함
정적배열 사이즈 구하기 -> 그런거 없음. arr.length, arr.size 존재X
벡터
벡터 선언시 : vector<pair<float,int>> vp;
벡터 선언(갯수 명시) vector<int> vp(5); -> 5칸 생성
벡터 선언(갯수 명시, 초기값 명시) vector<int> vp(5,2); -> 5칸을 모두 2로 초기화
2차원 벡터 선언 : vector<vector<int>> v(5,vector<int>(5,0)); -> 5x5칸을 0으로 초기화
벡터 삽입시: vp.push_back(make_pair(2,3));
벡터 원소 뒤집기 : reverse(vp.begin(), vp.end());
벡터 삭제 : v.erase(v.begin()+3);
벡터 범위삭제 : v.erase(v.begin()+1, v.begin+3);
벡터 정렬 : sort(vp.begin(), vp.end())
벡터 iterator소환 : vector<pair<int, string>>::iterator iter;
iterator 활용 : for(iter = vp.begin(); iter!= vp.end(); iter++)
vp.back()++; 로 방금 집어넣은 값 가감 가능
map
key/value 구성
map<char,int> m;
size
empty
begin,end,
m.insert(make_pair(k,v)) -------> push_back이 아님을 주의하라
- m.insert(make_pair('A', 1));
- m.insert(v.begin(), v.end()); -> 벡터의 모든 값들을 추가
erase
- m.erase(3) -> key값이 3 인 원소 삭제
- m.erase(m.begin()) -> iterator를 넘겨서 삭제, 여기선 첫 번째 원소 삭제
find
count = key가 k인 노드의 개수 return
if( m.find('B') != m.end() ) --> 존재한다면
map 전체를 순회하며 key와 value 출력하는 두 가지 방법
1. iterator 지정
- map<char, int>::iterator it;
- for(it = m.begin(); it != m.end(); it++)
- { it->first / it->second }
2. auto 키워드 사용
- for(auto it = m.begin(); it != m.end(); it++)
- { it->first / it->second }
set
key만 존재(정렬된 집합, 중복X)
set<int> s;
size
empty
begin,end,
s.insert(k) -------> push_back이 아님을 주의하라
- s.insert(1);
- s.insert(v.begin(), v.end()); -> 벡터의 모든 값들을 추가
erase
- s.erase(3) -> 값이 3 인 원소 삭제
- s.erase(m.begin()) -> iterator를 넘겨서 삭제, 여기선 첫 번째 원소 삭제
find
s.count(k) = 값이 k인 노드의 개수 return
벡터에서 최댓값, 최솟값 찾기(#include<algorithm>)
int min = *min_element(vec.begin(), vec.end());
int max = *max_element(vec.begin(), vec.end());
스택
입력 : push
삭제 : pop
조회 : top
큐
입력 : push
삭제 : pop
조회 : front/back
memset 활용
#include<cstring>
bool check[50];
memset(check, false, sizeof(check)); 모두 false로 초기화
string을 쪼개면 나오는 str[0] = char형임!
#include<cmath>
pow(3,2) => 9 / sqrt(36) => 6 ////////둘 다 double로 나오는걸 알아야해
SQL(ORACLE 기준)
TO_CHAR(sysdate,'MMDDYYYYHH24MISS')
EXTRACT(HOUR FROM CAST(DATETIME AS TIMESTAMP)
DATETIME(연,월,일)
TIMESTAMP(세세한시간까지)
NVL(NAME, 0) -> NULL일경우 0으로 출력
NVL2(NAME, y, n) -> NULL아니면 Y, NULL이면 N 출력
DECODE(NAME, NULL, 'N', 'Y') -> NULL이면 N, NULL아니면 Y 출력
LEFT OUTER JOIN (왼쪽은 모두 조회, 오른쪽은 맞는 조건만)
UPPER(대문자전환)
LOWER(소문자전환)
★복습필요★
1. LIKE
2. CASE WHEN ~~ LIKE 'Intake%' THEN 'X'
WHEN ~~
WHEN ~~
ELSE 'O'
END
AS 중성화