본문 바로가기

전체 글120

백준 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.
백준 13164 행복 유치원 C++ 간단한 해설  다음과 같은 문제에서는 조를 k개의 조로 나누고, 그 조의 최댓값과 최솟값의 차가 비용이다.그리고 그 차의 합이 최소가 되는 값을 구해야 한다. 그러면 우리가 그 값을 어떻게 생각해야할까? 5 31 3 5 6 10다음과 같이 값이 주어졌다고 생각해보자. 그러면 당연히 5와 6을 묶고, 그리고 제일 차이가 적어보이는 3이랑 묶어서 1 / 3 5 6 / 10 또는, 1 3 / 5 6 / 10 이런 두 가지 경우의 수가 나올 것이다. 여기서 지목해야 하는 것은 값의 차이이다. 값의 차이를 기준으로 묶으면 된다.그러면 값의 차이를 기준으로 입력값을 다음과 같이 나타낼 수 있다. // 이전1 3 5 6 10// 이후 2 2 1 4 이렇게보니까 뭔가 감이 잡힌다.아까 내가 임의로 선택한 방식이 어떤 .. 2024. 11. 18.
백준 1990 소수인팰린드롬 C++ 간단한 해설 범위가 5~100,000,000이므로 최대 1억까지의 정수를 탐색한다. O(n) 정도면 얼추 된다는 뜻이다. 일단 에라토스테네스의 체를 이용해서 소수를 판별한다. 그리고 범위 안의 소수인 수들만 팰린드롬 판별을 하면 된다. 팰린드롬 판별은 수를 문자열로 변환하고, reverse() 메서드를 이용해서 간단하게 비교하면 된다. 답 #include #include #include #include #define ll long longusing namespace std;int main(){ cin.tie(0); ios_base::sync_with_stdio(0); ll a,b; cin>>a>>b; vector v(b+1,true); v[0]=v[1]=false; for(ll i=2;i ans; for.. 2024. 11. 14.
백준 27896 특별한 서빙 C++ 간단한 해설처음에는 투포인터를 사용해서 문제를 풀려고했었다. 그러나 음식을 앞에 서있는 학생부터 순서대로 서빙할 때, 어떤 한 순간이라도 불만도가 M 이상이 되면 학생들은 ‘가지 운동’을 일으키게 된다. 이 지문때문에, 우선순위 큐로 관리해서 푸는 것이 해법임을 깨달았다. 처음부터 일단 음식을 파로 받는다. 그러다가 불만도가 M 이상이 되면, 제일 큰 값을 가지로 바꾸면 된다. (이때, 더해준 값을 빼준 값으로 바꿔야하므로 -2*x_i로 한다.) 답#include #include #include #include #define ll long longusing namespace std;int main(){ cin.tie(0); ios_base::sync_with_stdio(0); ll n,m; cin>>n>.. 2024. 11. 8.
백준 23883 알고리즘 수업 - 선택 정렬 3 C++ 간단한 해설N개의 서로 다른 양의 정수가 저장된 배열 A가 있다. 선택 정렬로 배열 A를 오름차순 정렬할 경우 K 번째 교환되는 수를 구해야한다. 그런데 K가 최대 50만이고 시간제한은 3초이니까 30억미만으로 연산을 실행한다고 생각하면 된다. 은근 널널하므로 그냥 하나씩 힙을 이용하여서 인덱스를 추적하는 방식으로 조절하면 된다.  힙을 이용하는 방법에는 여러 가지가 있는데, set, priority_queue, map, multiset, multimap이 있지만, N개의 서로 다른 양의 정수가 저장되어 있으므로 그냥 set을 골랐다.답 #include #include #include #include using namespace std;int main(){ cin.tie(0); ios_base::sync.. 2024. 10. 22.
백준 16469 소년 점프 C++ 간단한 해설 방문 배열을 3개 만들어서 bfs를 통해 최소 방문을 시간을 기록한다.3개 배열을 비교하고, 그 최대값이  세 악당이 모일 때 걸린 시간이다. 답#include #include #include #include using namespace std;int r,c;int board[100][100];int visited[3][100][100];int dy[4]={0,0,1,-1};int dx[4]={1,-1,0,0};bool set(int index,int y,int x,int val){ if(y=r||x=c) return false; if(board[y][x]==1) return false; if(visited[index][y][x]>r>>c; for(int i=0;i>str; for(int .. 2024. 10. 21.