본문 바로가기

알고리즘51

백준 17835 면접보는 승법이네 C++ 간단한 해설 각 도시들 중에서 가장 가까운 면접장의 거리가 가장 먼 도시를 구하는 문제 이런 문제는 반대로 생각하면 된다.각 면접장들 중에서 거리가 가장 먼 도시를 찾으면 되는데, 각 면접장들을 초기 원소로 두고 다익스트라를 하면 된다.이때, 도로가 단방향이고, 우리는 반대로 구하므로 u->v를 v->u로 두는 것이 포인트 답#include #include #include #include #include #define ll long longusing namespace std;vector>> graph;ll n,m,k,u,v,c;int main(){ cin.tie(0); ios_base::sync_with_stdio(0); cin>>n>>m>>k; graph.resize(n+1,vector>()); for.. 2024. 12. 18.
백준 5052 전화번호 목록 C++ 간단한 해설 앞에서부터 접두어를 확인해서 존재유무를 파악하면 된다. 입력이 다음과 같다고 생각해보자. 22909909929099909 두 입력값의 답은 모두 NO이다. 먼저 처음 값이 909이므로, 9, 90, 909 모두 존재하는지 확인한다. 두번째 입력 또한, 존재하는지 확인해야하는데, 이를 위해서 vector 배열로 입력값을 모두 입력받은 뒤, sort함수를 활용하여서 정답값을 올바르게 출력하도록 유도한다. 이전에 입력한 배열값이 존재하는지 확인할려면, 여러 방법이 있겠지만 나는 map을 활용하였다.c++에서는 BST로 map을 구현하기 때문에 find()나 count()로 O( log(n) )에 값 조회를 할 수 있다. 답 #include #include #include #include #incl.. 2024. 12. 11.
백준 7490 0 만들기 C++ 간단한 해설n이 최대 9까지이고, 경우의 수가 공백, +, -의 3가지이므로, 연산자를 고르는 경우의 수는 3^8개이다.브루트포스를 해서 전부 세보자. 그런데 C++로 하면 파싱에 어려움을 겪을 수 있다. C++에서 파싱은 기본적으로 노가다이다.(설명을 위해 공백도 연산자라 하자.)나의 경우, 연산자를 고르고 연산자가 공백인 경우, 공백이 존재하는 문자열과 없는 문자열 2개를 만든다.정답을 출력할 경우 공백이 존재하는 문자열을 사용하여 출력하고, 그게 아니면 공백이 존재하지 않는 문자열로 파싱을 한다. 공백이 존재하지 않는 문자열을 이용하여 파싱할 때, 일단 연산자의 위치를 배열에 저장한다.그리고 연산자의 위치를 토대로 stoi()를 적절히 이용하면 된다.  답#include #include #inclu.. 2024. 11. 29.
백준 1450 냅색문제 C++ 간단한 해설 이전 포스팅과 비슷하게 2^30의 경우의 수이므로 meet in middle러 2^15, 2^15로 나눈다. 기존 논지는 이전 포스팅과 비슷하다. 백준 1208 부분수열의 합 2 C++간단한 해설 meet in middle을 활용하면 된다. 중간에서 만나기를 활용하지 않을 경우, n이 최대 40이라서 부분 수열의 개수가 2^40의 경우가 나오게 된다. 그러나, 중간에서 만나기를 활용하는 경우ash9river.tistory.com ll rightIdx=upper_bound(rightPartialSum.begin(),rightPartialSum.end(),limitVal)-rightPartialSum.begin();ans+=rightIdx; c- 왼쪽 부분수열의 값을 target으로한 upper.. 2024. 11. 25.
백준 1208 부분수열의 합 2 C++ 간단한 해설 meet in middle을 활용하면 된다. 중간에서 만나기를 활용하지 않을 경우, n이 최대 40이라서 부분 수열의 개수가 2^40의 경우가 나오게 된다. 그러나, 중간에서 만나기를 활용하는 경우 왼쪽 부분 수열 2^20, 오른쪽 부분 수열 2^20, 총 부분 수열의 개수는 2*2^20=2^21이다. 왼쪽 부분 수열 합 배열을 만들고, 그 배열에서 값을 선택하고 오른쪽 부분 수열에서 (S - 값)을 구하면 된다.물론 왼쪽에서만 S가 나올 수 있고, 오른쪽에서만 S가 나올 수 있다. 반례는 다음과 같다. 4 10 0 0 1answer: 84 00 0 0 0answer: 1540 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.. 2024. 11. 25.
백준 7453 합이 0인 네 정수 C++ 간단한 해설 시간제한이 12초이니까, a+b와 c+d로 나누어서 이진탐색을 활용하면 된다. 입력이 a[0] b[0] c[0] d[0]a[1] b[1] c[1] d[2]...이런식으로 주어지는 것에만 유의 답#include #include #include #include #define ll long longusing namespace std;vector> v;vector a;vector b;int main(){ cin.tie(0); ios_base::sync_with_stdio(0); int n; cin>>n; v.resize(4,vector(n)); for(int i=0;i>v[j][i]; } } for(int i=0;i 2024. 11. 18.