일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 알고리즘
- Biconnected_Component
- data_structure
- sstream
- Articulation_Point
- 총정리
- Critical_Path_Analysis
- Pair
- c++
- STL
- 구현
- 백준
- list
- Algorithm
- 5397
- template
- 예제
- class_template
- red-black tree
- function_template
- 자료구조
- qsort
- singly Linked List
- Heap
- 문법
- connected_component
- 13305
- sort
- '0'
- deletion
- Today
- Total
- Today
- Total
- 방명록
목록c++/백준 문제 풀이 (17)
어제의 나보다 성장한 오늘의 나
BFS 문제 중 기본 문제이다. BFS , DFS 문제를 찾고 있다면 이 문제를 풀어보는 것을 추천한다. 풀이 ◎ BFS 방식으로 해결 한다. (queue STL을 사용한다.) ◎ 한번 움직일 때마다 현재 몇번 왔는지를 기록한다. (map에 기록해 두었다.) ◎ 경계를 넘지 않고 , 1이면 이동한다. BFS 방식으로 상하좌우 모두 이동 가능한지 확인 해보고 가능 하다면 queue에 저장. queue에 담긴 좌표를 하나씩 꺼내보면서 탐색. queue에서 모두 꺼내고, 비게 되었다면 탐색을 마친다. 반드시 도착 경로가 있기 때문에 , 탐색을 마쳤을 때 이동 횟수가 map[N][M]에 저장 되어 있다. Coding #include #include #include using namespace std; int m..
이런 오류는 처음이었다... 매우 당황 스러웠지만 천천히 나의 코드를 살펴 보았다. 아니나다를까 cout
풀이 : 알고리즘만 잘 세우면 손 쉽게 해결할 수 있는 문제이다. 먼저 입력 받은 문자열을 자릿수에 따라 나누어서 map에 저장해둔다. 만약 AECDF 를 입력 받았다면 map에 (A,10000) , (E,1000) , (C,100) (D,10) (F,1) 저장해둔다. 그렇게 모든 문자열들을 저장한다. 만약 중복된 값이 나왔다면 더해서 저장한다. AAC 이런 문자열이 나왔다면 (A, 100) 을저장한 뒤 (A, 10)을 더해서 저장한다. 즉, (A,110)을 저장한다. 모든 입력이 끝나고 각 문자마다 second(map의 second 값) 값이 잘 정리되어 있다. (각각의 second 값) * (1~9 사이 값 지정) 들의 전체 합 이 가장 큰 수가 되야 하므로, second값을 따로 vector에 저장..
풀이 : 30의 배수이려면 3의 배수이면서 동시에 10의 배수이면 된다. 3의 배수는 각 자리 숫자의 합이 3의 배수이면 된다. 예를 들어 126 같은 경우 각 자리 숫자의 합은 1+2+6 = 9 이다. 9는 3의 배수이다. 그러면 126은 3의 배수이다. 10의 배수는 마지막에 0이 붙으면 된다. 이 두가지 조건을 만족하면 30의 배수라고 할 수 있다. 각 자리의 숫자의 합이 3의 배수인지 , 숫자열 속 0이 존재하는 지를 확인 한 뒤 두 조건을 모두 충족한다면 내림 차순 정렬 후 출력해주면 된다. Coding #include #include #include using namespace std; int main(int args , char** argv){ vector nums; // 각 자리 숫자 저장..
※ 문제의 S를 N으로 두고 풀었기 때문에 헷갈리지 않게 조심해주세요. 풀이 : 단순한 그리디 문제이다. 가장 많은 숫자를 더해서 N을 완성 시켜야 하므로, 작은 수부터 차례로 1,2,3,4,.....,k 까지 쭈욱 더한다. 1~k까지 더한 값을 N에서 뺐을 때 0보다 크고 N보다 같거나 작은 수가 나온다면 정답은 k이다. 예를 들어보자. 100 = (1+2+.....+13) + 9 . 9는 1~N 사이 값이므로 정답은 13이다. 좀 더 자세히 설명 해보자면 9는 이미 1~13 안에 들어있기 때문에 이렇게 바꿔줘야 한다. 100 = (1+2+.....12) + (13+9) = (1+2+.....12) + 22 따라서 갯수(k)는 13이다. Coding #include using namespace std;..
간단한 Greedy 문제이다. 정렬 후, for 반복으로 arr[i] * (arr_size()-i) 를 다 더해주면 답이 나온다. #include #include #include using namespace std; int main(int args ,char** argv){ int N; cin >> N; vector pi; int temp; for(int i = 0 ; i > temp; pi.push_back(temp); } sort(pi.begin() , pi.end()); int pi_size = pi.size(); int answer = 0 ; for(int i = 0 ; i < N ; ++i){ answer += pi[i] * (pi_size-i); } cout
풀이 : ① 입력 된 문장을 +,- 와 숫자로 나눈다. ( substr 사용) ② 조건에 맞게 계산을 한다. 가장 작은 값이 결과로 나오도록 해야 하므로 - 가 나오기 전까지는 모든 숫자를 더 해주고, -가 한 번이라도 나오면 그 이후로는 모두 빼주면 된다. Coding #include #include #include using namespace std; int main(int args ,char** argv){ string str; cin >> str; vector ops; // str에 들어있는 + , - 순서대로 저장. vector nums; // str에 들어있는 숫자들 순서대로 저장. int first_index = 0; int last_index = 0; // 입력된 문장을 + , - 와 숫자..
알고리즘 도시를 하나 씩 옮겨가면서 첫 번째 도시~ 현재 도시 중 가장 주유 값이 적은 것을 선택한다. 현재도시~다음 도시 까지의 도로의 길이를 구한다. (첫 번째 도시 ~ 현재도시 중 가장 적은 주유값) * (현재도시~다음 도시 까지의 도로의 길이) 를 total에 더한다. 이 과정을 첫 번째 도시 부터 마지막 도시까지 적용하면 쉽게 구할 수 있다. Coding #include #include using namespace std; int main(int args ,char** argv){ int N ; long long int temp; cin >> N; vector street; vector cost_gas; for(int i = 0 ; i > temp; street..