목록C++ (24)
Seung's Learning Record
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/RNR8D/btsFz9iYIPr/BaCjmK6kiKvjexddt7oq8k/img.png)
난이도 : 실버3 소요시간 : 23m 사용한 풀이법 : DP 풀이 과정 dp[1] = 1 => 1 dp[2] = 1+1, 2 => 2 dp[3] = 1+1+1, 1+2, 2+1, 3 => 4 dp[4] = 1+1+1+1, 1+1+2, 1+2+1, 1+3, 2+1+1, 2+2, 3+1 => 7 위의 식을 잘 보면 1로 시작하는 건 곧 1+3 인거라서 3을 이루는 덧셈의 경우의 수, 즉 dp[3]만 알면 됨 2로 시작하는건 2+2라서 dp[2]만 알면되고 3으로 시작하는건 dp[1]만 알면 됨. dp[5]를 예시로 들어보자 1+…. 일때는 4를 이루는 경우들만 알면 됨 ⇒ dp[4] == dp[5-1] 2+…. 일때는 3을 이루는 경우들만 알면 됨 ⇒ dp[3] == dp[5-2] 3+…. 일때는 2를 이루..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bgMX5J/btsELsJlhde/bGhrnTTE4p0HT8KH8y3qSK/img.png)
난이도 : 실버2 소요시간 : 58분 사용한 풀이법 : 백트래킹 풀이 과정 1. 현재 원소 위치와 총합을 매개변수로 하는 func()정의 2. 현위치 변수가 n과 같고, 총합이 s와 같은 경우에 카운트 후 리턴 3. 조건 미 충족 시, func() 재귀 4. 재귀는 다음 위치의 수를 더하는 경우와, 더하지 않는 경우 두가지로 진행 5. S가 0일 때, 모두 더하지 않은 경우를 카운트에서 제외시켜야 함. 작성 코드 #include using namespace std; int n, s; int arr[30]; int cnt = 0; void func(int cur, int tot){ if(cur == n){ if(tot == s) cnt++; return; } func(cur+1, tot+arr[cur]);..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/buXItj/btsEGjNaa6F/qSpngKlSNtIqZP8m8W0Pz0/img.png)
난이도 : 골드5 소요시간 : 47분 사용한 풀이법 : bfs 풀이 과정 1. color 입력 받는 동시에 배열에 삽입 2. for문 돌면서 미방문한 곳 발견 시 bfs() 호출 3. bfs()함수에서는 호출 된 부분의 색과 동일한 곳만 탐색 4. 탐색이 끝나면 normal++ 후 bfs 재호출 5. color배열 탐색 종료 후, 적록색약 버전 카운트위해 vis[][] 0으로 재초기화 6. color배열의 'G'를 'R'로 대치 7. bfs()호출 및 blind++과정 반복 8. normal과 blind 각각 출력 작성 코드 #include #include #include using namespace std; queue Q; char color[101][101]; int vis[101][101]; int..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cixZIF/btsEEGQdkz6/QftmJd6fmJWiEKdukQ8Jdk/img.png)
난이도 : 실버2 소요시간 : 1시간 9분 사용한 풀이법 : bfs,queue 풀이 과정 1. 테스트 케이스 시작 때 마다 vis[][], bc[][] 배열 0으로 초기화 2. 배추 위치 입력 들어올 때 마다 bc[][]배열 1 삽입 3. for문 돌면서 방문 이력이 없으면서 배추가 있는 곳을 만나면 bfs 실행 => 하나의 배추 군단이 끝나면 bfs종료 후, cnt++됨 4. cnt값 출력 작성 코드 #include #include #include using namespace std; queue Q; int bc[50][50]; int vis[50][50]; int t,n,m,k,x,y; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int d..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bE4SZ2/btsEmWE2ZH6/LLaG6QE0If7WnEdXrAscpk/img.png)
난이도 : 실버1 소요시간 : 1시간 28분 사용한 풀이법 : dfs,queue 풀이 과정 1. 수빈 현 위치로 부터의 거리 측정용 배열 dist[], 이동 가능 위치 체크용 큐 Q[] 생성; 2. dist[]는 -1로 초기화, Q[]에 수빈 현위치 push; 3. dist[k]에 값이 들어가기 전까지 while 루프{} 4. 현위치 확인용 변수 cur에 Q.front() 대입; 5. cur이 -1, +1,*2 일때의 상황 for문 돌리면서 bfs 진행 6. 조건 충족 시, 해당 상황의 dist 값을 dist[cur]+1로 설정; 7. while 탈출 시 dist[k]값 출력; #include #include using namespace std; queue Q; int dist[100002]; int m..
재귀와 백트래킹은 개념은 정말 어려울게 없지만 문제를 풀때는 정말 머리를 쥐어짜내게 만드는거같다... 이 두 개념은 정말 문제를 많이 풀어봐야만 감이 잡히는 개념이기에 관련 문제를 많이 풀어보는걸 추천! 재귀 함수 하나의 함수에서 자기 자신을 다시 호출해 작업을 수행하는 알고리즘이다. 어떠한 문제를 재귀로 푼다는 것은 귀납적인 방식으로 문제를 해결하겠다는 것과 같다. 재귀함수를 작성할 땐, 다음과 같은 조건이 지켜져야 한다. 특정 입력에 대해서는 자기 자신을 호출하지 않고 종료되어야 함.(Base condition) 모든 입력은 base condition으로 수렴해야 함. void func(int n){ if(n == 0) return; cout
DFS(Depth First Search) 다차원 배열에서 각 칸을 방문할 때 깊이를 우선으로 방문하는 알고리즘이다. 넓게 탐색하는 것이 아닌 깊게 탐색하는 방법이다. 각각의 좌표가 시작 좌표에서 떨어진 거리를 알 수 있었던 bfs와 달리 dfs는 거리 측정이 힘들다. 그래서 배열에서 탐색을 하는 문제에선 주로 BFS를 사용하여 문제를 푼다. 그렇다고 DFS가 아예 안쓰이는 것은 아니니 잘 이해하고 넘어가는게 좋다. DFS 구현 이론 큐를 사용하는 BFS와 달리 DFS는 스택을 사용하여 구현한다. BFS에서 사용한 예시인 파란칸 찾기 문제를 예시로 대략적인 플로우를 살펴보자. 시작 좌표 방문 표시 후, 스택에 push 스택의 top값을 pop하고 해당 좌표에 접해있는 상,하,좌,우 좌표를 확인 인접 좌표..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/k5GpZ/btsz1e47zlT/CncmzCDi4KvSKBdk5qYNIk/img.png)
BFS(Breadth First Search) BFS란 다차원 배열에서 각 칸을 방문할 때 너비를 우선으로 방문하는 알고리즘이다. 시작 정점을 방문한 후, 인접한 정점들을 우선 방문하는 방법이다. 해당 그래프의 방문 순서가 저럴 경우, 큐에 값이 들어가고 나가는 순서는 다음과 같다. push(0) -> pop(0) -> push(1), push(2) -> pop(1) -> push(3) -> pop(2) -> push(4) -> pop(3) -> pop(4) BFS구현 이론 BFS 구현을 위해서는 큐를 사용해야 한다. 쉬운 이해를 위해 빨간색,파란색이 섞여있는 2차원 배열에서 파란색 칸만을 탐색하는 알고리즘을 작성하는 과정을 예로 들어 구현 플로우를 대강 정리해보자. 시작 좌표(0,0)를 방문 표시 후,..
Deque 이란? Restricted sturcture의 끝판왕인 덱은 양쪽 끝에서 삽입과 삭제가 모두 가능하다. Deque 성질 원소의 추가 O(1) 원소의 제거 O(1) 최상단의 원소 확인 O(1) 최상단의 원소를 제외한 나머지 원소들은 확인 및 변경은 원칙적으로 불가능 하지만 STL을 통해 인덱스에 접근이 가능하다. Deque 구현 덱의 구현 방법에는 배열을 사용하여 구현하는 방법과 STL을 사용하는 방법이 있다. 배열을 사용한 구현 const int MX = 1000000; int dat[2*MX+1]; int head = MX, tail = MX; void push_front(int x){ dat[head]=x; head--; } void push_back(int x){ dat[tail]=x; ..
Queue 란? 한쪽 끝에서 원소를 넣고 반대쪽 끝에서 원소를 뺄 수 있는 자료구조이다. 먼저 들어간 원소가 먼저 나오게 되는 FIFO(First In First Out) 구조이다. 큐에서는 원소가 제거되는 쪽을 가장 앞인 front, 원소가 삽입되는 쪽을 가장 뒤인 rear라고 부른다. Queue 성질 원소의 추가 O(1) 원소의 제거 O(1) 맨 앞, 맨 뒤 원소 확인 O(1) 맨 앞, 맨 뒤를 제외한 나머지 원소들은 확인 및 변경은 원칙적으로 불가능 Queue 구현 스택과 마찬가지로 큐 역시 배열을 이용하여 구현하는 방법과 STL을 이용하여 구현하는 방법이 있다. 배열을 사용한 구현 스택에서의 구현 방법을 큐에 대입해보자. 원소가 삽입되면 tail이 가르키는 인덱스에 값을 넣고 tail++를 하면된..